为什么CouchDB中的MapReduce称为“增量”?

时间:2012-06-28 00:42:38

标签: data-structures couchdb mapreduce terminology

我正在阅读O'Reilly CouchDB的书。我对第64页的reduce / re-reduce / incremental-MapReduce部分感到困惑。在O'Reilly的书中用句子留下了很多东西

  

如果您有兴趣推动CouchDB的增量减少功能,请查看Google关于Sawzall的论文,......

如果我正确理解“incremental”这个词,它指的是B树数据结构中的某种加法运算。我还不明白为什么它比典型的map-reduce有些特别,可能还没有理解它。在CouchDB中,它提到了map函数没有副作用 - 这是否也适用于reduce?

为什么CouchDB中的MapReduce被称为“增量”?

帮助者问题

  1. 用Sawzall解释有关增量MapReduce的引用。
  2. 为什么同一件事的两个术语即减少?减少并重新减少?
  3. 参考

    1. 关于Sawzall
    2. 的Google论文 CouchDB维基中的
    3. Introduction to CouchDB views以及大量模糊的博客参考。
    4. CouchDB O'Reilly book

2 个答案:

答案 0 :(得分:8)

您链接的

This页面解释了它。

视图(这是CouchDB中map reduce的重点)可以通过重新索引仅自上次索引更新以来已更改的文档来更新。这是增量部分。

这可以通过要求reduce函数是refereically透明来实现,这意味着它总是返回给定输入的相同输出。

对于数组值输入,reduce函数也必须是可交换的和关联的,这意味着如果在同一个reducer的输出上运行reducer,您将收到相同的结果。在该维基页面中,它表示为:

f(Key, Values) == f(Key, [ f(Key, Values) ] )

Rereduce是从多个reducer调用中获取输出并再次通过reducer运行的地方。这有时是必需的,因为CouchDB通过减速器批量发送东西,所以有时并不是所有需要减少的密钥都会在一次性发送后发送。

答案 1 :(得分:8)

为了略微添加user1087981所说的内容,reduce功能是增量的,因为CouchDB执行reduce过程的方式。

CouchDB使用它从视图函数创建的B树,实质上它在数组中执行减少计算。这是来自O'Reilly Guide的B树的一个非常简单的模型,显示the example in the section you quoted from的叶节点。

Reduce B-Tree http://guide.couchdb.org/draft/views/02.png

那么,为什么这种增量呢?好吧,最终的reduce只在查询时执行,所有 reduce 计算都存储在B-Tree视图索引中。因此,假设您向数据库添加了另一个"fr"值的新值。上面第1,第2和第4个节点的计算不需要重做。添加了新的"fr"值,仅为该第3个叶节点重新计算reduce函数。

然后在查询时,对索引值执行最终(rereduce=true)计算,并返回最终值。您可以看到reduce的这种增量特性允许重新计算相对于添加的新值的时间,而不是现有数据集的大小。

没有副作用是这个过程的另一个重要部分。例如,如果您的reduce函数依赖于在遍历所有值时维护的其他某个状态,那么这可能适用于第一次运行,但是当添加新值并进行增量reduce计算时,它将不会没有相同的状态可用 - 因此无法获得正确的结果。这就是为什么reduce函数需要无副作用的原因,或者user1087981将它“引用透明”