Я пытался использовать MongoDB 2.4.3 (также попытался 2.4.4) с mapReduce в кластере с 2 осколками с каждой 3 репликами. У меня проблема с результатами задания mapReduce, которые не сводятся к сборке вывода. Я попробовал Incremental Map Reduce. Я также попытался "слить" вместо сокращения, но это тоже не сработало.
Запуск команды по сокращению карты на mongos: (coll не оштукатурен)
db.coll.mapReduce(map, reduce, {out: {reduce: "events", "sharded": true}})
Что дает следующий результат:
{
"result" : "events",
"counts" : {
"input" : NumberLong(2),
"emit" : NumberLong(2),
"reduce" : NumberLong(0),
"output" : NumberLong(28304112)
},
"timeMillis" : 418,
"timing" : {
"shardProcessing" : 11,
"postProcessing" : 407
},
"shardCounts" : {
"stats2/192.168.…:27017,192.168.…" : {
"input" : 2,
"emit" : 2,
"reduce" : 0,
"output" : 2
}
},
"postProcessCounts" : {
"stats1/192.168.…:27017,…" : {
"input" : NumberLong(0),
"reduce" : NumberLong(0),
"output" : NumberLong(14151042)
},
"stats2/192.168.…:27017,…" : {
"input" : NumberLong(0),
"reduce" : NumberLong(0),
"output" : NumberLong(14153070)
}
},
"ok" : 1,
}
Итак, я вижу, что mapReduce запускается на 2 записи, что приводит к выходу 2 записей. Однако в postProcessCounts для обоих осколков входной счет остается 0. Также попытка найти запись с поиском на _id не дает результата. В файле журнала MongoDB мне не удалось найти сообщения об ошибках, связанные с этим.
Попробовав воспроизвести это с помощью вновь созданной выходной коллекции, я также охарактеризовал hashed _id, и я также дал те же индексы, что я не смог воспроизвести это. При выводе одного и того же ввода в другую коллекцию
db.coll.mapReduce(map, reduce, {out: {reduce: "events_test2", "sharded": true}})
Результат сохраняется в выходной коллекции, и я получил следующий вывод:
{
"result" : "events_test2",
"counts" : {
"input" : NumberLong(2),
"emit" : NumberLong(2),
"reduce" : NumberLong(0),
"output" : NumberLong(4)
},
"timeMillis" : 321,
"timing" : {
"shardProcessing" : 68,
"postProcessing" : 253
},
"shardCounts" : {
"stats2/192.168.…:27017,…" : {
"input" : 2,
"emit" : 2,
"reduce" : 0,
"output" : 2
}
},
"postProcessCounts" : {
"stats1/192.168.…:27017,…" : {
"input" : NumberLong(2),
"reduce" : NumberLong(0),
"output" : NumberLong(2)
},
"stats2/192.168.…:27017,…" : {
"input" : NumberLong(2),
"reduce" : NumberLong(0),
"output" : NumberLong(2)
}
},
"ok" : 1,
}
При повторном запуске script с тем же вводом, который снова появляется во втором сборнике, он показывает, что он уменьшает значение postProcessCounts. Таким образом, функции карты и сокращения выполняют свою работу отлично. Почему он не работает над большей коллекцией? Я здесь что-то не так? Существуют ли какие-либо особые ограничения на коллекции, которые можно использовать в качестве вывода для сокращения карты?