2012-08-22 15 views
6

¿Cómo puedo enviar un registro específico a todos mis reductores?Hadoop envía el registro a todos los reductores

Conozco la clase de Particionador y lo que hace, pero no veo ninguna manera fácil de asegurar que un registro vaya a todos los reductores.

Básicamente, el particionamiento en cuenta este método:

int getPartition(K2 key, 
      V2 value, 
      int numPartitions) 

Mi primera idea era tener la herramienta de particionado y el asignador de colaborar de la siguiente manera: el Mapper mantiene la salida del registro de un número de veces igual al número de reducir tareas y Partitioner devuelve todos los enteros (de 0 a numPartitions-1), de esta manera, asegúrese de que el registro llegue a todas las particiones.

¿Hay alguna otra manera más inteligente de resolver esto? Por ejemplo, devuelvo -1 para los registros que necesito enviar a todas las particiones y el marco hace eso para mí cuando ve el -1 devuelto.

Respuesta

5

El particionador no funciona de esa manera. Su trabajo es mirar la clave (generalmente) y el valor (raramente) para determinar a qué reductor se debe enviar el par. Esto sucede después del mapeador y antes del reductor.

En su lugar, usted (el asignador) debería poder consultar el contexto para la configuración que puede responder al número total de reductores (particiones). Su asignador puede generar una clave compleja que comprende la clave real que desea y un número de partición. Sabes cuántas veces escribir esto porque el mapeador puede averiguar el número de reductores (ver arriba). Todo lo que el particionador tiene que hacer es desglosar el valor clave compuesto, extraer el índice reductor objetivo y devolver ese índice.

Por cierto, esto significa que si utiliza esta técnica para enviar recuentos (si está ordenando) u otros metadatos que se utilizarán más adelante en el procesamiento, entonces sus claves de datos reales deben seguir el mismo compuesto formato. De hecho, probablemente tendrá que incluir en la clave compuesta un indicador que describa el tipo de par clave/valor que es (por ejemplo, 1 = datos reales, 0 = metadatos de procesamiento).

+0

También necesito actualizar esta respuesta con respecto al comparador de agrupación que va a necesitar. –

+0

Así es como yo también pensaba. No lo describí muy claramente y también estaba pensando en tener un contador en el objeto Partitioner para hacer un seguimiento de cuál es la próxima partición que tiene que devolver. Sin embargo, no estoy seguro de que esto sea una solución porque el objeto Partitioner podría ser GC-ed y el contador reiniciarse. En cuanto al comparador de agrupación, creo que esto depende de mis requisitos que no describí. Volveré si es necesario. Gracias! – Razvan

Cuestiones relacionadas