Я хотел бы использовать 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 - не тот инструмент, который я хочу сделать. 1011 *
Я новичок в БД Mongo и буду признателен за любую помощь. Заранее спасибо
ОШИБКА:
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 }});