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

Posted

技术标签:

【中文标题】为啥 CouchDB 中的 MapReduce 被称为“增量”?【英文标题】:Why is MapReduce in CouchDB called "incremental"?为什么 CouchDB 中的 MapReduce 被称为“增量”? 【发布时间】:2012-06-29 12:04:15 【问题描述】:

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

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

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

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

帮助问题

    用 Sawzall 解释关于增量 MapReduce 的引用。 为什么同一事物有两个术语,即归约?减少再减少?

参考文献

    一篇关于 Sawzall 的 Google 论文。 Introduction to CouchDB views 在 CouchDB wiki 和许多模糊的博客引用中。 CouchDB O'Reilly book

【问题讨论】:

...我还不确定这个术语的目的是什么,但我有一些模糊的想法,可能与复制、数据结构或 mapreduce 工作的逻辑有关——正在调查。 【参考方案1】:

你链接的This页面解释了它。

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

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

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

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

Rereduce 是您从多个 reducer 调用中获取输出并再次通过 reducer 运行的地方。这有时是必需的,因为 CouchDB 通过 reducer 批量发送内容,因此有时并非所有需要归约的键都会一次性发送。

【讨论】:

【参考方案2】:

稍微补充一下 user1087981 所说的,由于 CouchDB 执行 reduce 过程的方式,reduce 功能是增量的。

CouchDB 使用它从视图函数创建的 B-Tree,本质上它以值块的形式执行归约计算。这是来自O'Reilly Guide 的一个非常简单的 B 树模型,显示了the example in the section you quoted from 的叶节点。

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

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

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

【讨论】:

抱歉"reduce""rereduce" 有什么区别?它们在叶子或父节点等不同位置的操作是否相同?

以上是关于为啥 CouchDB 中的 MapReduce 被称为“增量”?的主要内容,如果未能解决你的问题,请参考以下文章

CouchDB:使用 Reduce 时如何在 Map 函数中使用数组键?

为啥 couchdb 正在寻找“_users”数据库?

为啥 CouchDB 使用仅附加 B+ 树而不是 HAMT

couchdb - Map Reduce - 如何在 Reduce 函数中加入不同的文档和组结果

为啥大公司使用 Mnesia 而不是使用 Riak 或 CouchDB [关闭]

如何获取 couchdb 中键的值