MongoDB map-reduce缓慢且内存不足

时间:2011-08-09 17:47:29

标签: mongodb mapreduce

我想将MongoDB用作我正在构建的分析系统的后端。 使用MongoDB的主要优点之一是内置的map reduce。 由于我们处于“中等数据”规模,我们还不需要Hadoop的开销。

出于测试目的,我插入了5000万行类型

{
 user_id: xxxx,
 thing_id:xxxx,
 time: xxx
}

在EC2大型实例上使用user_id索引。它是一个单实例mongodb(没有分片)。

db.user_thing_like.find({user_id: 37104857}) 

不到一秒钟。

然而,我希望计算用户条目数量的mapreduce整晚都会因为内存不足而返回错误,要么我必须做一些愚蠢的事情,要么mongo db不适合我想做的工具。< / p>

我是Mongo DB的新手,非常感谢任何帮助。提前致谢

错误:

Tue Aug  9 13:15:58 uncaught exception: map reduce failed:{
        "assertion" : "invoke failed: JS Error: out of memory nofile_b:2",
        "assertionCode" : 9004,
        "errmsg" : "db assertion failure",
        "ok" : 0
}

MAPREDUCE QUERY:

db.user_thing_like.mapReduce(map, reduce, {out: "tmp_test"}, {query: {"user_id" : 37104857 }});

地图和减少:

map = function () {
    for (var key in this) {
        emit(key.user_id, {count: 1});
    }
};

reduce = function (key, emits) {
    total = 0;
    for (var i in emits) {
        total += emits[i].count;
    }
    return {"count": total};
}

---更新---

我意识到mapreduce没有考虑我使用的语法中的查询过滤器。

这是正确的mapreduce查询。

db.runCommand({mapreduce: "user_thing_like", map: map, reduce: reduce, out: "tmp_test", query: {"user_id" : 37104857 }});

2 个答案:

答案 0 :(得分:1)

map = function () {
        emit(this.user_id, {count: 1});
    }
};

另外,尝试从手册中指定user_id作为MapReduce的排序键:

sort : <sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces>]

答案 1 :(得分:0)

我意识到mapreduce没有考虑我使用的语法中的查询过滤器。

这是正确的mapreduce查询。

db.runCommand({mapreduce: "user_thing_like", map: map, reduce: reduce, out: "tmp_test", query: {"user_id" : 37104857 }});