La clase Reducer
Después de clasificar y redistribuir los datos intermedios, todos los valores asociados a la misma clave son procesados por un único reductor (la misma instancia de la clase Reducer)., Normalmente, el reductor agrega los valores dados a un resultado final. El número de reducciones viene determinado por la distribución de los datos intermedios. Es decir, el marco lanza una tarea de reducción en cada trozo de datos.
<K2, listaV2)>* → Reductor → <K3, V3>*
public void run(Context context) throws IOException,
InterruptedException {
setup(context);
while (context.nextKey()) {
reduce(context.getCurrentKey(), context.getValues(), context);
}
cleanup(context);
}
El método reduce(), por defecto, emite su entrada como salida, actuando como una función de identidad, y debe ser sobreescrito. (Puede anular cualquiera de estos métodos, incluido run() para casos de uso avanzado)
El objeto de contexto para Reducer
Reducer tiene acceso al objeto context, que permite al reductor interactuar con el resto del entorno. El objeto context, que se pasa como argumento al reductor y a otros métodos, proporciona acceso a los datos de configuración del trabajo y permite al reductor emitir pares de salida mediante el método Context.write(key, value).
El método Context.getConfiguration() devuelve un objeto de configuración que contiene datos de configuración para un programa map/reduce en ejecución. Puede establecer pares arbitrarios (clave, valor) de datos de configuración en el trabajo (por ejemplo, con el método Job.getConfiguration( ).set( "myKey", "myVal" ) y, a continuación, recuperar estos datos en el reductor con el método Context.getConfiguration( ).get( "myKey" ). (Esto se hace normalmente en el método setup() del reductor)
El método cleanup() se anula principalmente (por defecto no se produce ninguna limpieza). Si necesita realizar una limpieza después de procesar todas las entradas, puede anular el valor predeterminado y configurarlo para que se ajuste a su caso de uso concreto.
No es necesario definir una clase reductora para el trabajo. Si no se define una clase, los registros de salida del mapeador se almacenan directamente en la tabla de salida sin ordenarlos y se omiten las fases de redistribución de particiones y reducción).