【发布时间】: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()。
我在 ts 和 cookie 上对此进行了索引,并且我有一个包含三个副本集的三个分片设置。我的集合在三个节点上分片,每个分片是一个具有 3 个成员的副本集。
为什么要花这么长时间?对于 prod,我将 ts 开放为一个范围(可能是最后一个小时),因此它的匹配文档将比 26 个多得多。
【问题讨论】:
-
投反对票?我的问题有什么问题?