2012-05-07 12 views
12

Sé que podemos establecer la propiedad "mapred.job.reuse.jvm.num.tasks" para volver a utilizar JVM. Mis preguntas son:reutilizar JVM en trabajos mapreduce de Hadoop

(1) cómo decidir el número de tareas que se deben establecer aquí, -1 o algunos otros enteros positivos?

(2) ¿es una buena idea reutilizar las JVM y establecer esta propiedad en el valor de -1 en las tareas de mapreduce?

¡Muchas gracias!

Respuesta

19

Si tiene tareas muy pequeñas que definitivamente se ejecutan una detrás de la otra, es útil establecer esta propiedad en -1 (lo que significa que una JVM engendrada se reutilizará varias veces). Así que solo genera (cantidad de tareas en su clúster disponible para su trabajo) -JVMs en lugar de (número de tareas) -JVMs.

Esto es una gran mejora en el rendimiento. En trabajos de larga ejecución, el porcentaje del tiempo de ejecución en comparación con la configuración de una nueva JVM es muy bajo, por lo que no proporciona un gran impulso al rendimiento.

También en tareas de larga ejecución es bueno recrear el proceso de la tarea, debido a problemas como la fragmentación del montón degradando su rendimiento.

Además, si tiene algunos trabajos a mitad del tiempo, puede volver a utilizar solo 2-3 tareas, teniendo una buena compensación.

+0

si habilita la tarea uber, ¿puede mapeadores y reduce compartir la misma JVM? ¿o es como que los mapeadores pueden compartir la misma JVM y los reductores pueden compartir la misma JVM? – MikA

1

La reutilización de JVM (solo posible en MR1) debería ayudar con el rendimiento porque elimina el retraso de inicio de la JVM pero solo es marginal y presenta varios inconvenientes (lea los efectos secundarios. La mayoría de las tareas se ejecutarán durante un tiempo prolongado (decenas de segundos o incluso minutos) y los tiempos de inicio no son el problema cuando observa los tiempos de ejecución de las tareas. Le gustaría comenzar una nueva tarea en borrón y cuenta nueva. Cuando reutiliza una JVM existe la posibilidad de que el montón no está completamente limpio (está fragmentado a partir de las ejecuciones anteriores). La fragmentación puede generar más GC y anular todas las ganancias de tiempo de inicio. Si hay una pérdida de memoria, también podría afectar el uso de la memoria, etc. Por lo tanto, es mejor inicie una nueva JVM para las tareas (si las tareas no son razonablemente pequeñas). En MR2 (YARN) - siempre se inicia una nueva JVM para las tareas. Para las tareas de Uber, solo ejecutará la tarea en la JVM local.

Cuestiones relacionadas