MapReduce en MongoDB no produce


Answers

Question

Estaba intentando usar MongoDB 2.4.3 (también intenté 2.4.4) con mapReduce en un clúster con 2 fragmentos con cada 3 réplicas. Tengo un problema con los resultados del trabajo mapReduce que no se reduce a la recopilación de resultados. Intenté reducir el mapa incremental . También intenté "fusionar" en lugar de reducir, pero tampoco funcionó.

El mapa reduce el comando ejecutado en mongos: (coll no está fragmentado)

db.coll.mapReduce(map, reduce, {out: {reduce: "events", "sharded": true}})

Que produce el siguiente resultado:

{
    "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,
}

Entonces veo que mapReduce se ejecuta en 2 registros, lo que da como resultado 2 registros entregados. Sin embargo, en los postProcessCounts para ambos fragmentos el conteo de entrada permanece en 0. Además, intentar encontrar el registro con una búsqueda en _id no arroja ningún resultado. En el archivo de registro de MongoDB no pude encontrar mensajes de error relacionados con esto.

Después de tratar de reproducir esto con una colección de resultados recién creada, que también se fragmentó en _id hash y también di los mismos índices, no pude reproducir esto. Al enviar la misma entrada a una colección diferente

db.coll.mapReduce(map, reduce, {out: {reduce: "events_test2", "sharded": true}})

El resultado se almacena en la colección de salida y obtuve el siguiente resultado:

{
    "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,
}

Al ejecutar de nuevo el script con la misma entrada que vuelve a mostrar en la segunda colección, muestra que se está reduciendo en postProcessCounts. Entonces, las funciones de mapa y reducir hacen bien su trabajo. ¿Por qué no funciona en la primera colección más grande? ¿Estoy haciendo algo mal aquí? ¿Existen limitaciones especiales en las colecciones que se pueden usar como salida para map-reduce?