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

时间:2016-05-12 20:25:14

标签: accumulo

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

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

我对列族进行聚合,并重写为以下格式(随时间汇总统计数据,并推导出新的统计数据)

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

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

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

2)是否有一种简单的方法可以将表复制到新表(应用了自定义迭代器),以便新表包含聚合数据?我真的不想做地图减少工作......

3)我应该看一下这样做的其他方法吗?

感谢您提出的所有建议。

1 个答案:

答案 0 :(得分:2)

简短的回答是肯定的,你可以在压实时做到这一点。但是,有一些警告。

  1. 您可能只应在full major compaction执行此操作,否则您的统计信息可能会汇总已删除的数据。
  2. 您的迭代器应区分聚合数据和非聚合数据。它可以通过检查密钥的结构来做到这一点。也许你想把它放在一个单独的列族中。
  3. 使用新表执行此类操作的典型方法是克隆表,添加主要的压缩迭代器,然后触发完整的主要压缩。

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