我在一个项目上工作,该项目基于大量原始数据,这些数据的聚合用于为面向公众的信息站点提供动力(一些简单的聚合,如各种总数和前十个总数,还有一些更多-复杂的聚合)。目前我们每隔几个月更新一次,包括添加新数据,可能更新或删除现有记录,离线重新运行所有聚合,然后将新聚合部署到生产中。
我们有兴趣提高更新频率,这样从头开始重新聚合所有内容是不切实际的,因此我们希望进行滚动聚合,更新现有聚合以反映新的、更改的或删除的记录。
CouchDB 的 MapReduce 实现大致提供了我正在寻找的功能:它将 MapReduce 任务的中间状态存储在一个大 B-tree 中,其中地图的输出位于叶子节点,reduce 操作逐渐将分支连接在一起。新的、更新的或删除的记录会导致子树被标记为脏并重新计算,但只需要触及归约树的相关部分,并且可以按原样重用来自非脏子树的中间结果。
但是,出于各种原因(CouchDB 未来的不确定性、对非 MR 一次性查询缺乏方便的支持、当前 SQL 繁重的实现等),我们不想在这个项目中使用 CouchDB,所以我'正在寻找这种树状增量 map-reduce 策略的其他实现(可能,但不一定,在 Hadoop 或类似的顶部)。
抢占一些可能的响应:
- 我知道 MongoDB 应该支持增量 MapReduce;在我看来,这不是真的,因为它真的只适用于添加到数据集,而不是更新或删除。
- 我也知道Inoop论文。这正是我想要的,但我认为他们没有公开他们的实现。