tutorial google example hadoop mapreduce

hadoop - google - mapreduce hdfs



Mapa de Hadoop one y reducción múltiple (6)

¿Estás esperando que cada reductor trabaje en exactamente los mismos datos mapeados? Pero al menos la "clave" debería ser diferente ya que decide a qué reductor ir.

Puede escribir una salida varias veces en el asignador y salir como clave (donde $ i es para el i-ésimo reductor y $ clave es su clave original). Y debe agregar un "Particionador" para asegurarse de que estos n registros se distribuyan en reductores, en función de $ i. Luego, use "GroupingComparator" para agrupar registros por $ key original.

Es posible hacer eso, pero no de manera trivial en un MR.

Tenemos un gran conjunto de datos para analizar con múltiples funciones de reducción .

Todos reducen el trabajo de algoritmo en el mismo conjunto de datos generado por la misma función de mapa . Leer el gran conjunto de datos cuesta demasiado para hacerlo cada vez, sería mejor leer solo una vez y pasar los datos asignados a múltiples funciones de reducción .

¿Puedo hacer esto con Hadoop? He buscado los ejemplos y el intarweb pero no he podido encontrar ninguna solución.


Por supuesto, puede definir múltiples reductores. Para el trabajo (Hadoop 0.20) simplemente agregue:

job.setNumReduceTasks(<number>);

Pero. Su infraestructura debe admitir los reductores múltiples, lo que significa que debe

  1. tener más de una CPU disponible
  2. ajustar mapred.tasktracker.reduce.tasks.maximum en mapred-site.xml en consecuencia

Y, por supuesto, su trabajo tiene que coincidir con algunas especificaciones. Sin saber lo que exactamente quieres hacer, solo puedo darte consejos generales:

  • la salida del mapa clave debe ser particionable mediante% numreducers O bien, debe definir su propio particionador: job.setPartitionerClass(...) por ejemplo con un particionador aleatorio ...
  • los datos deben ser reducibles en el formato particionado ... (¿se necesitan referencias?)

Obtendrá múltiples archivos de salida, uno por cada reductor. Si desea una salida ordenada, debe agregar otro trabajo que lea todos los archivos (múltiples tareas de mapa esta vez ...) y escribirlas ordenadas con un solo reductor ...

Eche un vistazo también a Combiner-Class, que es el Reducer local . Significa que puede agregar (reducir) ya en la memoria sobre los datos parciales emitidos por el mapa. Un buen ejemplo es el WordCount-Example. El mapa emite cada palabra como clave y su cuenta como 1: (palabra, 1). El combinador obtiene datos parciales del mapa, emite (,) localmente. El Reducer hace exactamente lo mismo, pero ahora algunos (Combinados) wordcudos ya son> 1. Ahorra ancho de banda


Puede usar claves compuestas. Digamos que necesitas dos tipos de reductores, ''R1'' y ''R2''. Agregue identificadores para estos como un prefijo a sus claves o / p en el asignador. Entonces, en el mapeador, una clave ''K'' ahora se convierte en ''R1: K'' o ''R2: K''.

Luego, en el reductor, pase los valores a las implementaciones de R1 o R2 en función del prefijo.


Supongo que quieres ejecutar diferentes reductores en una cadena. En hadoop, "múltiples reductores" significa ejecutar varias instancias del mismo reductor. Yo propondría que ejecutaras un reductor a la vez, proporcionando una función de mapa trivial para todas ellas, excepto la primera. Para minimizar el tiempo de transferencia de datos, puede usar la compresión.


Tal vez una solución simple sería escribir un trabajo que no tenga una función de reducción. Entonces pasaría todos los datos mapeados directamente a la salida del trabajo. Usted acaba de establecer el número de reductores a cero para el trabajo.

Luego, escribirías un trabajo para cada función de reducción diferente que funcione con esa información. Sin embargo, esto significaría almacenar todos los datos asignados en el HDFS.

Otra alternativa podría ser combinar todas sus funciones de reducción en un único Reducer que genera múltiples archivos, usando una salida diferente para cada función diferente. Múltiples salidas se mencionan en este artículo para hadoop 0.19 . Estoy bastante seguro de que esta característica está rota en la nueva API mapreduce publicada con 0.20.1, pero aún puedes usarla en la API mapred más antigua.


Todavía no entiendo tu problema, puedes usar la siguiente secuencia:

base de datos -> mapa -> reducir (use cat o None dependiendo del requisito) y luego almacene la representación de datos que ha extraído. si está diciendo que es lo suficientemente pequeño como para caber en la memoria, almacenarlo en el disco no debería ser un problema.

También su uso del paradigma MapReduce para el problema dado es incorrecto, usar una sola función de mapa y múltiples funciones de reducción "diferentes" no tiene sentido, muestra que solo está usando el mapa para transferir datos a diferentes máquinas para hacer cosas diferentes. no necesita hadoop ni ninguna otra arquitectura especial para eso.