Pregunta

Al ejecutar un trabajo de MapReduce con un combinador específico, ¿el combinador se ejecuta durante la fase de clasificación? Entiendo que el combinador se ejecuta en la salida de mapper para cada derrame, pero parece que también sería beneficioso funcionar durante los pasos intermedios cuando se fusione la clasificación. Supongo que en algunas etapas del tipo, la salida mapeador para algunas claves equivalentes se mantiene en la memoria en algún momento.

Si esto no sucede actualmente, ¿hay alguna razón en particular, o simplemente algo que no se ha implementado?

¡Gracias por adelantado!

¿Fue útil?

Solución

Los combinadores están allí para ahorrar ancho de banda de red.

El mapautput se clasifica directamente:

sorter.sort(MapOutputBuffer.this, kvstart, endPosition, reporter);

Esto sucede justo después de que se realiza el mapeo real. Durante la iteración a través del búfer se verifica si se ha establecido un combinador y, en caso afirmativo, combina los registros. Si no, se derrama directamente en el disco.

Las partes importantes están en el MapTask, si quieres verlo por ti mismo.

    sorter.sort(MapOutputBuffer.this, kvstart, endPosition, reporter);
    // some fields
    for (int i = 0; i < partitions; ++i) {
        // check if configured
        if (combinerRunner == null) {
          // spill directly
        } else {
            combinerRunner.combine(kvIter, combineCollector);
        }
    }

Esta es la etapa correcta para guardar el espacio en disco y el ancho de banda de la red, porque es muy probable que la salida tenga que transferirse. Durante la fase de fusión/shuffle/sort, no es beneficioso porque entonces debe cruzar más cantidades de datos en comparación con la ejecución del combinador en el momento de finalización del mapa.

Tenga en cuenta que la fase de clasificación que se muestra en la interfaz web es engañosa. Es solo pura fusión.

Otros consejos

Hay dos oportunidades para administrar el combinador, ambos en el lado del mapa del procesamiento. (Una muy buena referencia en línea es de "Hadoop: The Definitive Guide" de Tom White - - https://www.inkling.com/read/hadoop-definitive-guide-tom-white-3rd/chapter-6/shuffle-and-sort )

La primera oportunidad viene en el lado del mapa después de completar la clasificación en memoria por clave de cada partición, y antes de escribir esos datos ordenados en el disco. La motivación para ejecutar el combinador en este punto es reducir la cantidad de datos que finalmente se escriben al almacenamiento local. Al ejecutar el combinador aquí, también reducimos la cantidad de datos que deberán fusionarse y ordenarse en el siguiente paso. Entonces, para la pregunta original publicada, sí, el combinador ya se está aplicando en este primer paso.

La segunda oportunidad llega justo después de fusionar y clasificar los archivos de derrames. En este caso, la motivación para ejecutar el combinador es reducir la cantidad de datos que finalmente se envían a través de la red a los reductores. Esta etapa se beneficia de la aplicación anterior del combinador, que ya puede haber reducido la cantidad de datos que se procesarán por este paso.

El combinador solo ejecutará cómo lo entiendes.

Sospecho que la razón por la que el combinador solo funciona de esta manera es que reduce la cantidad de datos que se envían a los reductores. Esta es una gran ganancia en muchas situaciones. Mientras tanto, en el reductor, los datos ya están allí, y si los combina en el tipo/fusión o en su reducción de la lógica, realmente no va a importar computacionalmente (se hace ahora o más tarde).

Entonces, supongo que mi punto es: puedes obtener ganancias combinando como dices en la fusión, pero no será tanto como el combinador del lado del mapa.

No he pasado por el código, pero en referencia a Hadoop: la guía definitiva de Tom White 3rd Edition, menciona que si se especifica el combinador, se ejecutará durante la fase de fusión en el reductor. El siguiente es extracto del texto:

"Las salidas del mapa se copian a la memoria de reducción de la tarea JVM si son lo suficientemente pequeñas (el tamaño del búfer está controlado por mapred.job.shuffle.input.buffer.percent, que especifica la proporción del montón para usar para este propósito); de lo contrario, se copian al disco. Cuando el búfer en memoria alcanza un tamaño umbral (controlado por MapRed.job.shuffle.merge.percent), o alcanza un número umbral de salidas de map (mapred.inmem.merge.threshold), Se fusiona y se derrama al disco. Si se especifica un combinador, se ejecutará durante la fusión para reducir la cantidad de datos escritos en el disco. "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top