map减少了很长时间才能减少26条记录

时间:2012-10-31 01:07:48

标签: mongodb mapreduce

这就是我正在做的事情:

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将它们放入桶中,然后计算桶数。我会假设它将根据查询FIRST执行查找,然后使用这些返回值执行map / reduce。如果是这种情况,那么集合的大小根本不重要。它眨眼间就在第二行做了count()

我已将此编入索引tscookie,并且我有三个碎片设置,其中包含三个副本集。我的集合在三个节点上分片,每个分片是一个包含3个成员的副本集。

为什么这花了这么长时间?对于prod,我打算将ts打开为一个范围(也许是最后一个小时),因此它将拥有许多匹配文档,而不仅仅是26个。

1 个答案:

答案 0 :(得分:1)

mapReduce调用参数应该是这样的(单个对象中的所有选项):

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