2012-07-31 11 views
5

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.MongoDB: efectos secundarios de mapReduce

Mi investigación hasta ahora sugiere que las estructuras de datos MR se pasan por valor (a través de serialización) por lo que se pierden las estructuras de datos en memoria, incluidas las conectadas al alcance "global". Los espacios de nombres están aislados del espacio de nombres del lado del servidor JS principal, así que dbeval parece que no puede alcanzarlos (o, al menos, no sé dónde mirar). 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, aproximadamente coll.insert no siendo una función, mientras que typeof coll.insert === 'function' es true.

Para ser 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.

+0

¿Qué tipo de información exactamente genera? El resultado de MR puede persistir en una colección. En C#, lo especifico como: MyInputCollection.MapReduce (map, reduce, MapReduceOptions.SetOutput ("MyOutputCollection")); A continuación, lee desde la colección persistente 'MyOutputCollection'. –

+0

Quiero guardar información que es independiente de la salida MR. Piense en ello como un escape de datos, por ejemplo, para la información estructurada detallada de registro/evaluación comparativa que deseo procesar con código, por lo que no quiero que termine en los archivos de registro. – Sim

+0

¿Ha intentado utilizar una colección limitada para el registro? No entiendo por qué coll.insert debería fallar ... –

Respuesta

2

Como se supone, no es posible (como en MongoDB 2.2) acceder a otro DB desde 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, deja print() en el registro mongo como la única opción de salida "fuera de banda".

Dependiendo de su salida de diagnóstico, un enfoque para tratar sería:

  • añadir un marcador único que le permitirá identificar la salida (o incluso la carrera de salida) en la salida del registro

  • serializar su salida utilizando tojson() por lo que se registra con alguna estructura analizable y lo ideal sería emitida en una sola línea cuando se print()

  • escribir un script para tail la mongod.log log para las líneas que coincidan con su marcador único y insertar aquellos en otra colección para informar

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

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

Ejemplo 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 } 
+0

esto es más o menos lo que terminamos haciendo.Construí una clase de registrador que inicia sesión en una colección y usa print(). Durante MR, las inserciones de la colección de registros generan excepciones que se tragan. Desearía que 10gen prestara más atención al soporte de desarrollo/depuración. – Sim

+0

@Sim: sería útil si pudiera crear un [problema Jira] (https://jira.mongodb.org/browse/SERVER) en el rastreador MongoDB (cola SERVIDOR, componente 'MapReduce/Distinct/Group') con algunos más información sobre lo que sería necesario/útil para la depuración. Tal vez algo similar a Hadoop [Contadores MapReduce] (http://diveintodata.org/2011/03/15/an-example-of-hadoop-mapreduce-counter/), con una devolución de llamada de salida de registro opcional al final de la ejecución . – Stennie

Cuestiones relacionadas