Карта MongoDB сокращается медленно и не хватает памяти

Я хотел бы использовать MongoDB в качестве серверной части для системы аналитики, которую я создаю. Одним из основных преимуществ использования MongoDB является встроенное уменьшение карты. Поскольку мы находимся в масштабе «средних данных», нам пока не нужны накладные расходы Hadoop.

В целях тестирования я вставляю 50 миллионов строк типа

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

С индексом user_id на крупном экземпляре EC2. Это единственный экземпляр mongodb (не сегментированный).

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

занимает меньше секунды.

Однако mapreduce, где я хотел подсчитать количество пользовательских записей, занял всю ночь и вернулся с ошибкой нехватки памяти, либо я должен делать что-то глупое, либо mongo db не подходит для того, что я хочу сделать.

Я новичок в 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
}

ПРЕДВАРИТЕЛЬНЫЙ ЗАПРОС:

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 }});

person lordOfChaos    schedule 09.08.2011    source источник


Ответы (2)


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>]
person Karoly Horvath    schedule 09.08.2011
comment
Решено. db.runCommand({mapreduce: user_thing_like, карта: карта, уменьшение: уменьшение, выход: tmp_test, запрос: {user_id: 37104857 }}); - person lordOfChaos; 09.08.2011

Я понял, что mapreduce не учитывает мой фильтр запросов в синтаксисе, который я использовал.

Вот правильный запрос mapreduce.

db.runCommand({mapreduce: "user_thing_like", map: map, reduce: reduce, out: "tmp_test", query: {"user_id" : 37104857 }});
person lordOfChaos    schedule 10.08.2011
comment
Такой комментарий должен быть включен в исходный вопрос, а не в качестве ответа на вопрос. Я переместил эти комментарии в вопрос для вас. - person Leopd; 03.10.2011