【问题标题】:Increment Insert Versus Map/Reduce增量插入与映射/减少
【发布时间】:2012-10-06 07:03:20
【问题描述】:

假设您有一组文档,其结构如下:

{ username: "jones",
    likes: 20,
    text: "Hello world!"
  }

此外,假设您正在构建的应用程序需要显示有关每个用户的总点赞数的统计信息。 Mongodb 文档显示,您可以使用这样的 Map/Reduce 函数来完成此操作:

function() {
    emit( this.username, {count: 1, likes: this.likes} );
  }

但是,对我来说,每次将新文档插入数据库时​​,简单地增加一个“Like”计数器似乎更直观。这不需要像 Map/Reduce 那样遍历整个集合。它会立即更新计数器,而不是在下次 Map/Reduce 进程运行时更新。而且架构看起来更简单。

有人可以在回答中解释为什么 Map/Reduce 函数是更好的解决方案吗?

【问题讨论】:

    标签: mongodb mapreduce


    【解决方案1】:

    我认为 MongoDB 文档中提出的 MapReduce 解决方案旨在更通用。也就是说,如果您对 stat(x) 的某些功能感兴趣 stat() 对于每条记录 x 并且您在设置数据集时不知道您会对 stat 感兴趣,然后 MapReduce 提供了一种很好的后验方法来聚合记录中的此类统计信息。

    如果您已经知道您将始终对每个 x 感兴趣的 stat(x),那么一定要尽可能多地进行预计算和存储。

    不过,我可以想象,在索引和搜索统计数据的时间与每次需要时计算它们之间存在一些权衡。如果数据集变得巨大(我不确定这里是否有一个好的估计),那么理论上每次只用 MapReduce 计算它可能更有利,因为检索的等待时间会很糟糕。

    我猜测 MapReduce 赢得该权衡的数据大小非常大,即使这样,如果您想对数据后计算做更多的事情,它可能并没有真正提高效率。

    【讨论】:

    • 谢谢。这是一个非常清楚的解释。为了把巨大的放在上下文中,让我们假设我们正在谈论 Stackoverflow 的后端数据存储。即使您已经知道需要汇总选票,计票是否会成为您建议使用 MapReduce 的示例?或者在这种权衡变​​得相关之前,它是否必须是一个谷歌规模的问题。在这一点上只是一个学术问题。我的应用程序很小,所以我会根据你的回答预先计算我的统计数据。
    • 我的猜测是,除了一些关于 Hadoop 用例应该是什么的随意帖子之外,没有什么可继续的了,它需要在 MapReduce 赢得检索之前达到数百 TB。如果数据碰巧已经分发并存储在不同的地方,无论出于何种原因,它也可能获胜。以下是一些链接:What Hadoop Is NotHadoop Dont's
    • 没有集合大小,其中 mapReduce 的速度与针对集合的查询相似,尤其是索引查询。 MongoDB 中的 MapReduce 很慢,在 javascript 中,必须遍历每个文档,必须运行单线程,必须将 BSON 转换为 JSON 回 BSON 等。另外,您可以使用聚合框架(在 2.2 中)比mapReduce,但直接预计算和查询会总是更快。
    【解决方案2】:

    MapReduce 不是为即席实时查询而设计的。它很慢。它更像是一种批处理机制,因此您提出的设计在性能方面会更有效率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多