【问题标题】:map reduce taking very long time to reduce 26 recordsmap reduce 需要很长时间才能减少 26 条记录
【发布时间】:2012-10-31 01:07:47
【问题描述】:

这就是我正在做的事情:

mongos> db.campaign_raw_data_459_imp.count()
21800002
mongos> db.campaign_raw_data_459_imp.find({ts:1350585328}).count()
26
mongos>  map = function () { emit(this.cookie, 1);}
function () {
  emit(this.cookie, 1);
}
mongos>  reduce = function (key, values) {return 1;}
function (key, values) {
  return 1;
}
mongos> 
mongos> db.campaign_raw_data_459_imp.mapReduce(map, reduce, {out: { replace : "garbage"}}, query={ts:1350585328})
//This is hanging and taking forever, over 10 minutes now

此集合中有 2100 万份文档。而且,对于给定的时间戳 (ts=1350585328),有 26 条记录。这里的目标是计算匹配记录中有多少唯一 cookie。所以它应该找到所有匹配的文档,其中 26 个。然后根据cookie将它们放入桶中,然后对桶进行计数。我假设它会根据查询首先进行查找,然后对这些返回值进行映射/归约。如果是这种情况,那么集合的大小根本不重要。它眨眼间就完成了第二行中的count()

我在 tscookie 上对此进行了索引,并且我有一个包含三个副本集的三个分片设置。我的集合在三个节点上分片,每个分片是一个具有 3 个成员的副本集。

为什么要花这么长时间?对于 prod,我将 ts 开放为一个范围(可能是最后一个小时),因此它的匹配文档将比 26 个多得多。

【问题讨论】:

  • 投反对票?我的问题有什么问题?

标签: mongodb mapreduce


【解决方案1】:

mapReduce 调用参数应如下所示(单个对象中的所有选项):

db.campaign_raw_data_459_imp.mapReduce(map, reduce, 
    {out: { replace : "garbage"}, query: {ts:1350585328}})

【讨论】:

  • 我正在使用 pymongo 驱动程序,根据文档,您不要将其全部归为 pymongo api.mongodb.org/python/2.0/examples/…
  • @Landon 好的,但是您的示例代码不是使用 mongo shell 吗?使用 pymongo,一切看起来都会有所不同。
  • 是的,我的示例代码在 mongo shell 中。我在那里制作我的代码,然后将其复制到我的驱动程序。是的,技术上不同的驱动程序执行不同,但我正在经历完全相同的时间等待 pymongo 驱动程序
  • @Landon 你不能直接复制参数,因为shell和pymongo的语法不同。当您在 shell 中运行时,我的答案中的代码运行速度是否一样慢?
  • 是的,它更快,但是仍然需要几秒钟的时间,但是这对我的 pymongo 进程没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 2013-10-11
  • 2012-12-04
  • 2012-12-03
  • 2014-07-21
  • 2019-10-26
  • 2012-06-24
相关资源
最近更新 更多