Por supuesto, puede definir varios reductores. Para el trabajo (Hadoop 0.20) simplemente agregue:
job.setNumReduceTasks(<number>);
Pero. Su infraestructura tiene que apoyar las múltiples reductores, lo que significa que usted tiene que
- tener más de una CPU disponible
- ajustar mapred.tasktracker.reduce.tasks.maximum en site.xml mapred consecuencia
Y, por supuesto, su trabajo tiene que coincidir con algunas especificaciones. Sin saber exactamente lo que usted quiere hacer, sólo puedo dar grandes consejos:
- la tecla mapa-salida o bien han de ser divisible por% numreducers o tiene que definir su propio particionador:
job.setPartitionerClass(...)
de con un ejemplo al azar-partidor ...
- los datos debe ser capaz de reducir-en el formato particionado ... (referencias necesarias?)
obtendrá varios archivos de salida, uno para cada reductor. Si desea una salida ordenada, debe agregar otra tarea leyendo todos los archivos (múltiples tareas de mapa esta vez ...) y escribirlas ordenadas con un solo reductor ...
Eche un vistazo también al Combiner- Clase, que es local Reducer. Significa que puede agregar (reducir) ya en la memoria sobre los datos parciales emitidos por el mapa. Muy 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
pero si agrego una nueva clave a la salida con el método 'context.write()' multiplique la transferencia de datos de los objetos 'Mapper'. solo resuelve el problema de lectura de archivos, ¿no? –
, entonces sugeriría mostrar los datos asignados como archivos y usar otros MR para procesar estos archivos. – Victor