在扫描和压缩时应用 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) 是否还有其他我应该关注的方法?
感谢所有建议。
简短的回答是肯定的,您可以在压缩时执行此操作。但是,有一些注意事项。
- 您可能应该只在 full major compaction 时执行此操作,否则您的统计信息可能会汇总已删除的数据。
- 您的迭代器应区分聚合数据和非聚合数据。它可以通过检查密钥的结构来做到这一点。也许您想将其放在单独的列族中。
使用新 table 执行此类操作的典型方法是克隆 table,添加主要压缩迭代器,然后触发完整的主要压缩。
另一种方法是执行 MapReduce 以从一个 table 输入并输出到另一个。
我已经实现了一个迭代器(扩展 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) 是否还有其他我应该关注的方法?
感谢所有建议。
简短的回答是肯定的,您可以在压缩时执行此操作。但是,有一些注意事项。
- 您可能应该只在 full major compaction 时执行此操作,否则您的统计信息可能会汇总已删除的数据。
- 您的迭代器应区分聚合数据和非聚合数据。它可以通过检查密钥的结构来做到这一点。也许您想将其放在单独的列族中。
使用新 table 执行此类操作的典型方法是克隆 table,添加主要压缩迭代器,然后触发完整的主要压缩。
另一种方法是执行 MapReduce 以从一个 table 输入并输出到另一个。