在扫描和压缩时应用 Accumulo 自定义迭代器

Accumulo custom Iterator applied at scan and compaction time

我已经实现了一个迭代器(扩展 WrappingIterator),它执行一些简单的统计聚合和重写键和值。本质上,我从这种形式的键开始:

key         qualifier:family             value
<id>        <val1>|<val2>:<time_info>    <statistic>

然后我对列族执行聚合并重写为以下格式(随着时间的推移聚合统计数据,并导出新的统计数据)

key         qualifier:family             value
<id>        <val1>:<val2>                <derived-statistics>

此自定义迭代器仅在扫描时应用于 table,并且运行良好,但性能开始成为问题。我考虑过以下提高性能的方法:

1) 有没有办法在压缩时应用这个迭代器?我的想法是答案是 'no',因为如果迭代器在 table 上进行扫描,那么扫描将不知道迭代器源(即原始数据)正在读取哪种数据格式或重写的行)。如果有办法做到这一点,那就太好了。

2) 是否有直接的方法将 table 复制到新的 table(应用自定义迭代器),以便新的 table 包含聚合数据?我真的不想开始 map-reduce 工作...

3) 是否还有其他我应该关注的方法?

感谢所有建议。

简短的回答是肯定的,您可以在压缩时执行此操作。但是,有一些注意事项。

  1. 您可能应该只在 full major compaction 时执行此操作,否则您的统计信息可能会汇总已删除的数据。
  2. 您的迭代器应区分聚合数据和非聚合数据。它可以通过检查密钥的结构来做到这一点。也许您想将其放在单独的列族中。

使用新 table 执行此类操作的典型方法是克隆 table,添加主要压缩迭代器,然后触发完整的主要压缩。

另一种方法是执行 MapReduce 以从一个 table 输入并输出到另一个。