2012-02-17 10 views
6

Estoy empezando a jugar con hadoop (pero aún no tengo acceso a un clúster, así que solo juego en modo independiente). Mi pregunta es, una vez que está en una configuración de clúster, ¿cómo se distribuyen las tareas y se puede transferir la base del código a nuevos nodos?¿Puede Hadoop distribuir tareas y código base?

Idealmente, me gustaría ejecutar grandes trabajos por lotes y si necesito más capacidad agregar nuevos nodos a un clúster, pero no estoy seguro si tendré que copiar el mismo código que se está ejecutando localmente o hacer algo especial para Mientras se ejecuta el trabajo por lotes, puedo agregar capacidad. Pensé que podría almacenar mi código base en el HDFS y hacer que se ejecute localmente para que se ejecute cada vez que lo necesite, pero eso significa que necesito algún tipo de script inicial en el servidor y necesito ejecutarlo primero.

¡Cualquier sugerencia o consejo sobre si esto es posible sería genial!

Gracias.

Respuesta

7

Cuando programa un trabajo de reducción de mapas utilizando el comando hadoop jar, el rastreador de empleos determinará cuántos mapeadores se necesitan para ejecutar su trabajo. Esto generalmente está determinado por la cantidad de bloques en el archivo de entrada, y este número es fijo, sin importar cuántos nodos de trabajador tenga. Luego enlistará uno o más tracktrackers para ejecutar su trabajo.

El jar de aplicación (junto con cualquier otro jar que se especifique utilizando el argumento -libjars), se copia automáticamente en todas las máquinas que ejecutan los tasktrackers que se utilizan para ejecutar sus jarras. Todo eso es manejado por la infraestructura de Hadoop.

Agregar tasktrackers adicionales aumentará el paralelismo de su trabajo suponiendo que hay tareas de mapa aún no programadas. Lo que no hará es volver a particionar automáticamente la entrada para paralelizar a través de la capacidad de mapa adicional. Entonces, si tiene una capacidad de mapa de 24 (asumiendo 6 mapeadores en cada uno de los 4 nodos de datos), y tiene 100 tareas de mapa con las primeras 24 ejecutándose, y agrega otro nodo de datos, obtendrá algo de velocidad adicional. Si solo tiene 12 tareas de mapa, agregar máquinas no lo ayudará.

Finalmente, debe conocer la localidad de referencia de datos. Como los datos deberían procesarse idealmente en las mismas máquinas que lo almacenan inicialmente, agregar nuevos rastreadores de tareas no necesariamente agregará velocidad de procesamiento proporcional, ya que los datos no serán locales en esos nodos inicialmente y deberán copiarse a través de la red.

+0

Gracias, excelente respuesta. Tiene sentido con Java, pero ¿es esto también cierto con el uso de la transmisión de Python? – Lostsoul

+2

Desde http://hadoop.apache.org/common/docs/r0.15.2/streaming.html#Package+Files+With+Job+Submissions: "Puede especificar cualquier ejecutable como el asignador y/o el reductor. no es necesario que los ejecutables preexistan en las máquinas del clúster, sin embargo, si no lo hacen, deberá usar la opción "-file" para indicarle a la estructura que empaquete los archivos ejecutables como parte del envío de trabajos ". Todo lo anterior con respecto a la adición de tasktrackers también es cierto para la transmisión. –

0

Antes de intentar construir un clúster Hadoop, le sugiero que juegue con Hadoop usando Amazon's Elastic MapReduce.

Con respecto al problema que está tratando de resolver, no estoy seguro de que Hadoop encaje correctamente. Hadoop es útil para trabajos por lotes trivialmente paralelizables: analizar miles de (o más) documentos, ordenar, volver a organizar datos). Hadoop Streaming le permitirá crear mapeadores y un reductor usando el lenguaje que desee, pero las entradas y salidas deben estar en un formato fijo. Hay muchos usos, pero, en mi opinión, el control del proceso no era uno de los objetivos del diseño.

[EDIT] Quizás ZooKeeper está más cerca de lo que está buscando.

+0

Planeo hacerlo. Solo quiero entender el proceso antes de pagar a Amazon. – Lostsoul

+0

Los precios de Amazon pueden ser un poco confusos. He ejecutado pequeños trabajos de reducción de mapas allí (pequeño conjunto de datos, algunos nodos) y cada ejecución fue de $ 0.25 USD más o menos. – Frank

0

Puede agregar capacidad al trabajo por lotes si lo desea, pero debe presentarse como una posibilidad en su base de código. Por ejemplo, si tiene un asignador que contiene un conjunto de entradas que desea asignar a múltiples nodos para tomar la presión que pueda. Todo esto se puede hacer, pero no con la instalación predeterminada de Hadoop.

Actualmente estoy trabajando en un marco anidado de mapa y reducción que amplía la base de código Hadoop y le permite generar más nodos según las entradas que obtiene el asignador o el reductor. Si te interesa, escríbeme y te explicaré más.

Además, cuando se trata de la opción -libjars, esto solo funciona para los nodos asignados por el rastreador de trabajos según las instrucciones del trabajo que se escribe. Entonces, si especifica 10 mapeadores, el -libjar copiará allí su código. Si desea comenzar con 10, pero seguir subiendo, los nodos que agregue no tendrán el código.

La manera más fácil de eludir esto es agregar su jar al classpath de la secuencia de comandos hadoop-env.sh. Eso siempre, cuando se inicia un trabajo, se copia ese jar a todos los nodos que conoce el clúster.

1

No estoy del todo de acuerdo con la respuesta de Daniel. Principalmente porque si "al iniciar un trabajo, el código jar se copiará a todos los nodos que conoce el clúster" es verdadero, incluso si usa 100 correlacionadores y hay 1000 nodos, el código para todos los trabajos siempre se copiará a todos los nodos No tiene sentido.

En cambio la respuesta de Chris Shain tiene más sentido que cada vez JobScheduler en JobTracker elige un trabajo a ser ejecutado e identifica una tarea para ser ejecutada por un DataNode particular, en este tiempo de alguna manera se transmite la TaskTracker desde donde copiar el código base.

Inicialmente (antes del inicio del trabajo mapreduce), la base de código se copió en varias ubicaciones como se define en el parámetro mapred.submit.replication. Por lo tanto, el rastreador de tareas puede copiar la base de código desde varias ubicaciones, y Jobtracker puede enviarle una lista.

Cuestiones relacionadas