2010-08-04 13 views
7

Mi equipo creó una aplicación Java utilizando las bibliotecas Hadoop para transformar un conjunto de archivos de entrada en resultados útiles. Dada la carga actual, un solo servidor multinúcleo funcionará bien para el próximo año más o menos. No (todavía) tenemos la necesidad de elegir un clúster Hadoop multiservidor, pero decidimos comenzar este proyecto "estar preparados".Ejecución de una aplicación Hadoop independiente en múltiples núcleos de CPU

Cuando ejecuto esta aplicación en la línea de comandos (o en eclipse o netbeans) todavía no he podido convencerlo de usar más de un mapa y/o reducir el hilo a la vez. Dado que la herramienta requiere mucha CPU, esta "rosca única" es mi actual cuello de botella.

Cuando se ejecuta en el perfilador netbeans veo que la aplicación se inicia varios hilos para diversos fines, pero sólo un único mapa/reducir se está ejecutando en el mismo momento.

Los datos de entrada se compone de varios archivos de entrada para Hadoop debería al menos ser capaz de ejecutar 1 hilo por cada archivo de entrada al mismo tiempo para la fase mapa.

¿Qué debo hacer para tener al menos 2 o incluso 4 hilos activos en ejecución (que debería ser posible para la mayor parte del tiempo de procesamiento de esta solicitud)?

Espero que esto sea algo muy tonto que he pasado por alto.


acabo de encontrar esto: https://issues.apache.org/jira/browse/MAPREDUCE-1367 Esto implementa la función que estaba buscando en Hadoop 0,21 Se introduce el mapreduce.local.map.tasks.maximum bandera de controlarlo.

Por ahora también he encontrado la solución que se describe here in this question.

Respuesta

5

No estoy seguro de si estoy en lo cierto, pero cuando ejecuta tareas en modo local, no puede tener múltiples asignados/reductores.

De todos modos, para establecer el número máximo de creadores de mapas en ejecución y reductores de utilizar las opciones de configuración y mapred.tasktracker.map.tasks.maximummapred.tasktracker.reduce.tasks.maximum por defecto esas opciones se establecen en 2, por lo que podría ser adecuado.

Por último, si usted quiere estar preparado para clúster de varios nodos ir directamente con el funcionamiento de esto en forma totalmente distribuida, pero tienen todos los servidores (NameNode, DataNode, TaskTracker, JobTracker, ...) se ejecutan en una sola máquina

+1

Gracias, por su observación, descargué la fuente y busqué eso. Descubrí que cuando se ejecuta en modo local, se usa org.apache.hadoop.mapred.LocalJobRunner para ejecutar realmente el trabajo. El método run() simplemente hace todo de forma secuencial. Sin enhebrar en absoluto. Encontré org.apache.hadoop.mapreduce.lib.map.MultithreadedMapper Una característica muy extraña: una implementación del mapeador que realiza el subprocesamiento FUERA del marco real de Hadoop. Según la documentación, solo es útil si no está vinculado a la CPU. Nuestra herramienta está unida a la CPU, por lo que no podemos usar esto. –

0

De acuerdo con this thread on the hadoop.core-user email list, querrá cambiar el ajuste mapred.tasktracker.tasks.maximum al número máximo de tareas que le gustaría que su máquina manejara (que sería el número de núcleos).

Este (y otras propiedades es posible que desee configurar) también se documenta en the main documentation on how to setup your cluster/daemons.

+2

No hay ninguna opción como: 'mapred.tasktracker.tasks.maximum', hay opciones separadas para el mapa y reducir:' mapred.tasktracker. {Map | reduce} .tasks.maximum', está debajo del segundo enlace que tiene al corriente. – wlk

+0

mi interpretación de eso fue que podrías tener 'map' o' reduce' o ninguno. El hilo del correo electrónico es de 2007, pero el autor de Hadoop mencionó el uso de 'mapred.tasktracker.tasks.maximum' –

+0

. Bien, este correo electrónico es de 2007, probablemente se trate de la versión anterior a 0.16 de hadoop, ya que se introdujeron opciones separadas para mapeadores y reductores en 0.16 (y 0.16 se introdujo en 2008) eche un vistazo a: http://hadoop.apache.org/common/docs/r0.15.2/cluster_setup.html#Configuring+the+Hadoop+Daemons y http://hadoop.apache.org/common/docs/r0.16.0/cluster_setup.html#Configuring+the+Hadoop+Daemons – wlk

2

Sólo una aclaración ... Si se ejecuta en modo local Hadoop que no tienen la ejecución en paralelo en un nivel de tarea (salvo que se está ejecutando> = 0,21 hadoop (MAPREDUCE-1367)). Aunque puede enviar múltiples trabajos a la vez y estos se ejecutan en paralelo, entonces.

Todos esos

mapred.tasktracker {mapa | reducir}. .tasks.máximo

¡Las propiedades solo se aplican al hadoop ejecutándose en modo distribuido!

HTH Joahnnes

+0

Correcto. La forma en que lo ejecuté hace dos años (http://stackoverflow.com/questions/3546025/) fue solo ejecutando un trabajo y tasktrackers. Entonces esto no es local y está a mitad de camino de pseudodistribuido. Esto hace posible el uso de múltiples núcleos de CPU sin la función 0.21 que mencionó. –

0

Lo que se quiere hacer es ejecutar Hadoop en el modo de "pseudo-distribuido". Una máquina, pero que ejecuta los rastreadores de tareas y los nodos de nombre como si fuera un clúster real. Entonces (potencialmente) ejecutará varios trabajadores.

Tenga en cuenta que si su entrada es pequeña, Hadoop decidirá que no vale la pena paralelizarla. Puede que tenga que convencerlo cambiando su tamaño de división predeterminado.

En mi experiencia, los trabajos Hadoop "típicos" están vinculados con E/S, a veces con memoria, mucho antes de que estén vinculados a la CPU. Puede que le resulte imposible utilizar por completo todos los núcleos en una máquina por este motivo.

+0

Para el trabajo encuadernado con CPU de la que se trataba esta pregunta (hace casi 2 años) estaba bien ejecutarlo en múltiples núcleos de CPU sin HDFS. De ahí una forma despojada del modo "pseudo-distribuido". –

Cuestiones relacionadas