Establecer el número de tareas de mapa y reducir tareas

Actualmente estoy ejecutando un trabajo, fijé el número de tareas del mapa en 20 pero obtuve un número mayor. También configuré la tarea de reducción en cero, pero todavía obtengo un número distinto de cero. El tiempo total para que se complete el trabajo de MapReduce tampoco se muestra. ¿Puede alguien decirme lo que estoy haciendo mal? Estoy usando este comando

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0 

Salida:

 11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164 11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18 11/07/30 19:48:56 INFO mapred.JobClient: Job Counters 11/07/30 19:48:56 INFO mapred.JobClient: Launched reduce tasks=13 11/07/30 19:48:56 INFO mapred.JobClient: Rack-local map tasks=12 11/07/30 19:48:56 INFO mapred.JobClient: Launched map tasks=24 11/07/30 19:48:56 INFO mapred.JobClient: Data-local map tasks=12 11/07/30 19:48:56 INFO mapred.JobClient: FileSystemCounters 11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_READ=4020792636 11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_READ=1556534680 11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_WRITTEN=6026699058 11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=1928893942 11/07/30 19:48:56 INFO mapred.JobClient: Map-Reduce Framework 11/07/30 19:48:56 INFO mapred.JobClient: Reduce input groups=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Combine output records=0 11/07/30 19:48:56 INFO mapred.JobClient: Map input records=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Reduce shuffle bytes=1974162269 11/07/30 19:48:56 INFO mapred.JobClient: Reduce output records=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Spilled Records=120000000 11/07/30 19:48:56 INFO mapred.JobClient: Map output bytes=1928893942 11/07/30 19:48:56 INFO mapred.JobClient: Combine input records=0 11/07/30 19:48:56 INFO mapred.JobClient: Map output records=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Reduce input records=40000000 [hcrc1425n30]s0907855: 

El número de tareas de mapa para un trabajo dado está determinado por el número de divisiones de entrada y no por el parámetro mapred.map.tasks. Para cada división de entrada, se genera una tarea de mapa. Por lo tanto, durante la vida útil de un trabajo de reducción de mapas, el número de tareas de mapas es igual al número de divisiones de entrada. mapred.map.tasks es solo una pista para InputFormat para la cantidad de mapas.

En su ejemplo, Hadoop ha determinado que hay 24 divisiones de entrada y generará 24 tareas de mapa en total. Sin embargo, puede controlar cuántas tareas de mapas se pueden ejecutar en paralelo con cada uno de los rastreadores de tareas.

Además, eliminar un espacio después de -D podría resolver el problema de reducción.

Para obtener más información sobre el número de tareas de mapa y reducir, consulte la URL siguiente

http://wiki.apache.org/hadoop/HowManyMapsAndReduces

Como Praveen menciona arriba, cuando se usan las clases básicas de FileInputFormat es solo el número de divisiones de entrada que constituyen los datos. El número de reductores está controlado por mapred.reduce.tasks especificado en la forma en que lo tiene: -D mapred.reduce.tasks=10 especificaría 10 reductores. Tenga en cuenta que el espacio después de -D es obligatorio; si omite el espacio, la propiedad de configuración se transfiere a la JVM pertinente, no a Hadoop.

¿Está especificando 0 porque no hay trabajo de reducción para hacer? En ese caso, si tiene problemas con el parámetro de tiempo de ejecución, también puede establecer el valor directamente en el código. Dado un job instancia de JobConf , llame

 job.setNumReduceTasks(0); 

dentro, digamos, su implementación de Tool.run . Eso debería producir salida directamente de los mapeadores. Si su trabajo en realidad no produce ningún resultado (porque está utilizando el marco solo para efectos colaterales como llamadas de red o procesamiento de imágenes, o si los resultados se contabilizan por completo en los valores de Contador), puede desactivar la salida llamando también

 job.setOutputFormat(NullOutputFormat.class); 

Es importante tener en cuenta que el marco MapReduce en Hadoop solo nos permite

sugerir el número de tareas de Map para un trabajo

que, como señaló Praveen arriba, corresponderá al número de divisiones de entrada para la tarea. A diferencia de su comportamiento para el número de reductores (que está directamente relacionado con la cantidad de archivos generados por el trabajo de MapReduce) donde podemos

demanda que proporcione n reductores.

Para explicarlo con un ejemplo:

Suponga que su tamaño de archivo de entrada hadoop es de 2 GB y establece el tamaño de bloque como 64 MB, por lo que las tareas de 32 Mappers se establecen para ejecutarse, mientras que cada asignador procesará 64 MB de bloque para completar el trabajo de Mapper de su trabajo de Hadoop.

==> El número de mapeadores configurados para ejecutarse depende completamente de 1) Tamaño del archivo y 2) Tamaño del bloque

Supongamos que ejecuta hadoop en un tamaño de clúster de 4: suponga que establece los parámetros mapred.map.tasks y mapred.reduce.tasks en su archivo conf en los nodos de la siguiente manera:

 Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4 Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2 Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4 Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1 

Supongamos que establece los parámetros anteriores para 4 de sus nodos en este clúster. Si observa que el Nodo 2 ha establecido solo 2 y 2, respectivamente, porque los recursos de procesamiento del Nodo 2 podrían ser menores (por ejemplo, 2 Procesadores, 2 Núcleos) y el Nodo 4 incluso menor a 1 y 1, respectivamente, debido a los recursos de procesamiento. en ese nodo hay 1 procesador, 2 núcleos, por lo que no puede ejecutar más de 1 asignador y 1 tarea de reductor.

Por lo tanto, cuando ejecuta el trabajo, el nodo 1, el nodo 2, el nodo 3, el nodo 4 se configuran para ejecutar un máximo. total de (4 + 2 + 4 + 1) 11 tareas del asignador simultáneamente de las 42 tareas del asignador que debe completar el Trabajo. Después de que cada nodo complete sus tareas de mapa, tomará las tareas pendientes del mapeador restantes en 42 tareas del asignador.

Ahora estamos hablando de reductores, ya que establecemos mapred.reduce.tasks = 0, por lo que solo obtendremos salida de mapeador en 42 archivos (1 archivo por cada tarea de mapeo) y no habrá salida de reductor.

En la versión más nueva de Hadoop, hay mapreduce.job.running.map.limit y mapreduce.job.running.reduce.limit mucho más granular que le permite establecer el correlacionador y el recuento de reductores independientemente del tamaño del archivo hdfs. Esto es útil si tiene restricciones para no utilizar grandes recursos en el clúster.

JIRA

De su registro comprendí que tiene 12 archivos de entrada ya que hay 12 mapas locales generados. Rack Los mapas locales se generan para el mismo archivo si algunos de los bloques de ese archivo se encuentran en algún otro nodo de datos. ¿Cuántos nodos de datos tiene?

En su ejemplo, las partes -D no se recogen:

 hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0 

Deben venir después de la parte del nombre de clase como esta:

 hadoop jar Test_Parallel_for.jar Test_Parallel_for -Dmapred.map.tasks=20 -Dmapred.reduce.tasks=0 Matrix/test4.txt Result 3 

Sin embargo, se permite un espacio después de -D .

También tenga en cuenta que cambiar la cantidad de mapeadores es probablemente una mala idea, ya que otras personas han mencionado aquí.

El número de tareas del mapa se define directamente por la cantidad de fragmentos que divide su entrada. El tamaño del fragmento de datos (es decir, el tamaño del bloque HDFS) es controlable y se puede configurar para un archivo individual, conjunto de archivos, directorio (-s). Por lo tanto, es posible establecer un número específico de tareas de mapa en un trabajo, pero implica establecer un tamaño de bloque HDFS correspondiente para los datos de entrada del trabajo. mapred.map.tasks también se puede usar para eso, pero solo si el valor proporcionado es mayor que el número de divisiones para los datos de entrada del trabajo.

Controlar el número de reductores a través de mapred.reduce.tasks es correcto. Sin embargo, establecerlo en cero es un caso bastante especial: la salida del trabajo es una concatenación de las salidas de los cartógrafos (no ordenados). En la respuesta de Matt uno puede ver más formas de establecer el número de reductores.

Una forma de boost el número de mapeadores es dar su entrada en forma de archivos divididos [puede usar el comando de división de Linux]. La transmisión de Hadoop generalmente asigna muchos mapeadores ya que hay archivos de entrada [si hay una gran cantidad de archivos], si no, intentará dividir la entrada en partes de igual tamaño.

  • Utilice -D propiedad = valor en lugar de -D propiedad = valor (elimine espacios en blanco adicionales). Por lo tanto, -D mapred.reduce.tasks = value funcionaría bien.

  • Establecer el número de tareas de mapa no siempre refleja el valor que ha establecido ya que depende del tamaño de división y del formato de entrada utilizado.

  • Establecer el número de reducciones definitivamente anulará el número de reducciones configuradas en la configuración del clúster / cliente.

Estoy de acuerdo en que la tarea del número mapp depende de la división de entrada, pero en algunos de los escenarios pude ver que era un poco diferente

case-1 Creé una tarea de mapp simple, solo crea 2 duplicados de salida de archivo (data ia mismo) comando que di debajo

bin / hadoop jar contrib / streaming / hadoop-streaming-1.2.1.jar -D mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv112.txt -mapper / home / amitav / workpython /readcsv.py

Case-2 Así que restringí la tarea mapp a 1, el out put vino correctamente con un archivo de salida, pero un reductor también se aligeró en la pantalla de la interfaz de usuario aunque restringí el trabajo del reductor. El comando se da a continuación.

bin / hadoop jar contrib / streaming / hadoop-streaming-1.2.1.jar -D mapred.map.tasks = 1 mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv115.txt – mapper /home/amitav/workpython/readcsv.py

La primera parte ya ha sido respondida, “solo una sugerencia” La segunda parte también ha sido respondida, “eliminar espacios adicionales alrededor =” Si ninguno de estos dos funciona, ¿estás seguro de que has implementado ToolRunner ?

El número de tareas del mapa depende del tamaño del archivo. Si desea n número de Mapa, divida el tamaño del archivo por n de la siguiente manera:

 conf.set("mapred.max.split.size", "41943040"); // maximum split file size in bytes conf.set("mapred.min.split.size", "20971520"); // minimum split file size in bytes 

La gente de esta teoría parece que no podemos ejecutar trabajos de reducción de mapa en paralelo.

Digamos que configuré un total de 5 trabajos de mapeador para ejecutarlos en un nodo particular. También quiero usar esto de tal manera que JOB1 pueda usar 3 mapeadores y JOB2 pueda usar 2 mapeadores para que la tarea pueda ejecutarse en paralelo. Pero las propiedades anteriores se ignoran, entonces, ¿cómo se pueden ejecutar trabajos en paralelo?

Por lo que entiendo leer arriba, depende de los archivos de entrada. Si los archivos de entrada son 100 significa que Hadoop creará 100 tareas de mapa. Sin embargo, depende de la configuración de Nodo en cuántos se pueden ejecutar en un punto del tiempo. Si un nodo está configurado para ejecutar 10 tareas de mapa, solo 10 tareas de mapa se ejecutarán en paralelo seleccionando 10 archivos de entrada diferentes de los 100 disponibles. Las tareas del mapa continuarán obteniendo más archivos a medida que completa el procesamiento de un archivo.