scripts script crear debugging mongodb logging mapreduce serverside-javascript

debugging - script - MongoDB: efectos secundarios de mapReduce



load scripts mongodb (1)

Durante el desarrollo de nuestros trabajos de reducción de mapas, nuestro código MR genera estructuras de datos de diagnóstico útiles independientemente de que los datos se reduzcan en el mapa. ¿Hay alguna manera fácil de obtener estos datos en el código que llamó mapReduce o persistirlos en Mongo? Simplemente escribiendo en el archivo de registro está resultando ser muy poco óptimo ya que (a) hay una gran cantidad de datos allí y (b) nuestra información de diagnóstico está muy estructurada y, de hecho, nos gustaría ejecutar consultas contra eso.

Hasta el momento, mi investigación sugiere que las estructuras de datos MR se pasan por valor (a través de la serialización), por lo que se pierden las estructuras de datos en la memoria, incluidas aquellas conectadas al alcance "global". Los espacios de nombres están aislados del espacio de nombres principal del servidor JS, por lo que dbeval que dbeval no los puede alcanzar (o, al menos, no sé dónde buscarlos). Por último, aunque todos los objetos y funciones de la base de datos están presentes, 10gen está generando (confundiendo) mensajes de error para evitar su uso, por ejemplo, sobre que coll.insert no es una función mientras typeof coll.insert === ''function'' es true

Para que quede claro, me interesa hacer esto para el desarrollo en un solo nodo, porque el soporte de registro / depuración en MongoDB es bastante limitado. Este tipo de efectos secundarios no son buenos en entornos de producción.


Como se supone, no es posible (como en MongoDB 2.2) acceder a otro DB desde dentro de las funciones de Mapa / Reducir. Además del posible impacto en el rendimiento, también existe la posibilidad de crear bloqueos y otros efectos secundarios no deseados.

Desafortunadamente eso deja print() en el registro de mongo como la única opción de salida "fuera de banda".

Dependiendo de su resultado de diagnóstico, un enfoque para intentar sería:

  • agregue un marcador único que le permita identificar la salida (o incluso la ejecución de salida) en la salida de registro

  • tojson() su salida usando tojson() para que se registre con una estructura parseable y se emita idealmente en una sola línea cuando print()

  • escriba una secuencia de comandos para alinear el registro de mongod.log con las líneas que coinciden con su marcador exclusivo e insertarlas en otra colección para informar

Ejemplo de código que se ejecutará desde una función M / R:

var diag = { ''run'' : diagrun, ''phase'': ''map'', ''key'' : z } print("MAPDIAG:" + tojson(diag));

Ejemplo de salida:

$ tail -f mongo.log | grep "^MAPDIAG" MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "mouse" } MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "cat" } MAPDIAG:{ "run" : "20120824", "phase" : "map", "key" : "dog" } MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "cat", "total" : 3 } MAPDIAG:{ "run" : "20120824", "phase" : "reduce", "key" : "dog", "total" : 2 }