¿Cómo realiza Hadoop las divisiones de entrada?

Esta es una pregunta conceptual que involucra Hadoop / HDFS. Digamos que tienes un archivo que contiene mil millones de líneas. Y por simplicidad, consideremos que cada línea tiene la forma donde k es el desplazamiento de la línea desde el principio y el valor es el contenido de la línea.

Ahora, cuando decimos que queremos ejecutar N tareas de mapa, ¿el marco divide el archivo de entrada en N divisiones y ejecuta cada tarea de mapa en esa división? ¿O tenemos que escribir una función de partición que realice las divisiones N y ejecutar cada tarea de mapa en la división generada?

Todo lo que quiero saber es si las divisiones se realizan internamente o si tenemos que dividir los datos manualmente.

Más específicamente, cada vez que se llama a la función map (), ¿cuáles son sus parámetros Key key and Value val ?

Gracias, Deepak

El InputFormat es responsable de proporcionar las divisiones.

En general, si tiene n nodos, el HDFS distribuirá el archivo en todos estos n nodos. Si comienza un trabajo, habrá n mapeadores por defecto. Gracias a Hadoop, el mapeador de una máquina procesará la parte de los datos que está almacenada en este nodo. Creo que esto se llama Rack awareness .

Por lo tanto, para resumir una historia larga: cargue los datos en el HDFS y comience un trabajo de MR. Hadoop cuidará la ejecución optimizada.

Los archivos se dividen en bloques HDFS y los bloques se replican. Hadoop asigna un nodo para una división basada en el principio de localidad de datos. Hadoop intentará ejecutar el asignador en los nodos donde reside el bloque. Debido a la replicación, existen múltiples nodos que alojan el mismo bloque.

En caso de que los nodos no estén disponibles, Hadoop intentará elegir un nodo que esté más cerca del nodo que aloja el bloque de datos. Podría elegir otro nodo en el mismo rack, por ejemplo. Un nodo puede no estar disponible por varias razones; todas las ranuras de mapa pueden estar en uso o el nodo simplemente puede estar abajo.

Afortunadamente, todo será cuidado por el marco.

El procesamiento de datos MapReduce está impulsado por este concepto de divisiones de entrada . El número de divisiones de entrada que se calculan para una aplicación específica determina el número de tareas del asignador.

La cantidad de mapas suele estar determinada por la cantidad de bloques DFS en los archivos de entrada.

Cada una de estas tareas del asignador se asigna, cuando es posible, a un nodo esclavo donde se almacena la división de entrada. El Administrador de recursos (o JobTracker, si está en Hadoop 1) hace todo lo posible para garantizar que las divisiones de entrada se procesen localmente.

Si no se puede lograr la ubicación de los datos debido a divisiones de entrada que cruzan los límites de los nodos de datos, algunos datos se transferirán de un nodo Datos a otro nodo Datos.

Suponga que hay 128 MB de bloque y que el último registro no encaja en el Bloque a y se propaga en el Bloque b , luego los datos en el Bloque b se copiarán al nodo que tenga Bloqueado a.

Echa un vistazo a este diagtwig.

enter image description here

Eche un vistazo a las preguntas relacionadas

Acerca de la división de archivos Hadoop / HDFS

¿Cómo se dividen los registros de proceso de Hadoop a través de los límites del bloque?

Para una mejor comprensión de cómo funciona InputSplits en hadoop, recomendaría leer el artículo escrito por hadoop para dummies . Es realmente útil.

Creo que lo que Deepak estaba preguntando era más acerca de cómo se determina la entrada para cada llamada de la función del mapa, en lugar de los datos presentes en cada nodo del mapa. Lo digo en base a la segunda parte de la pregunta: más específicamente, cada vez que se llama a la función map (), ¿cuáles son sus parámetros Key key y Value val?

En realidad, la misma pregunta me trajo aquí, y si hubiera sido un desarrollador experimentado de hadoop, podría haberlo interpretado como las respuestas anteriores.

Para responder la pregunta,

el archivo en un nodo de mapa determinado se divide en función del valor que establezcamos para InputFormat . (Esto se hace en Java usando setInputFormat () !)

Un ejemplo:

conf.setInputFormat (TextInputFormat.class); Aquí, pasando TextInputFormat a la función setInputFormat, le estamos diciendo a hadoop que trate cada línea del archivo de entrada en el nodo del mapa como la entrada a la función del mapa. Linefeed o carriage-return se utilizan para señalar el final de la línea. más información en TextInputFormat !

En este ejemplo: las claves son la posición en el archivo, y los valores son la línea de texto.

Espero que esto ayude.

FileInputFormat es la clase abstracta que define cómo se leen y distribuyen los archivos de entrada. FileInputFormat proporciona las siguientes funcionalidades: 1. seleccionar archivos / objetos que se deben usar como entrada 2. Define inputsplits que divide un archivo en tarea.

Según la funcionalidad básica de hadoopp, si hay n divisiones habrá n mapper.

Cuando se ejecuta un trabajo de Hadoop, divide los archivos de entrada en fragmentos y asigna cada división a un asignador para procesar; esto se llama InputSplit.

La respuesta corta es que InputFormat se ocupa de la división del archivo.

La forma en que abordo esta cuestión es mirando su clase predeterminada TextInputFormat:

Todas las clases de InputFormat son subclase de FileInputFormat, que se ocupa de la división.

Específicamente, la función getSplit de FileInputFormat genera una Lista de InputSplit, de la Lista de archivos definidos en JobContext. La división se basa en el tamaño de los bytes, cuyos Min y Max se pueden definir arbitrariamente en el archivo xml del proyecto.

Hay un trabajo de reducción de mapa separado que divide los archivos en bloques. Use FileInputFormat para archivos grandes y CombineFileInput Format para archivos más pequeños. También puede verificar si la entrada se puede dividir en bloques mediante el método de issplittable. Cada bloque se alimenta a un nodo de datos donde un mapa reduce la ejecución de trabajos para un análisis posterior. el tamaño de un bloque dependería del tamaño que haya mencionado en el parámetro mapred.max.split.size.

FileInputFormat.addInputPath (job, new Path (args [0])); o

conf.setInputFormat (TextInputFormat.class);

clase FileInputFormat funcation addInputPath , setInputFormat se ocupa de los inputsplit, también este código define la cantidad de mapeadores que se crean. podemos decir inputsplit y el número de mapeadores es directamente proporcional al número de bloques utilizados para almacenar archivos de entrada en HDFS.

Ex. si tenemos un archivo de entrada con un tamaño de 74 Mb, este archivo se almacena en HDFS en dos bloques (64 MB y 10 Mb). así que los inputsplit para este archivo son dos y se crean dos instancias mapper para leer este archivo de entrada.

Diferencia entre el tamaño del bloque y el tamaño de la división de entrada.

La división de entrada es una división lógica de sus datos, básicamente utilizada durante el procesamiento de datos en el progtwig MapReduce u otras técnicas de procesamiento. El tamaño de entrada dividida es el valor definido por el usuario y Hadoop Developer puede elegir el tamaño dividido en función del tamaño de los datos (la cantidad de datos que está procesando).

Input Split se usa básicamente para controlar el número de Mapper en el progtwig MapReduce. Si no ha definido el tamaño de la división de entrada en el progtwig MapReduce, entonces la división de bloques HDFS predeterminada se considerará como una división de entrada durante el procesamiento de datos.

Ejemplo:

Supongamos que tiene un archivo de 100MB y la configuración de bloques por defecto de HDFS es de 64MB, luego se dividirá en 2 divisiones y ocupará dos bloques de HDFS. Ahora tiene un progtwig MapReduce para procesar estos datos, pero no ha especificado la división de entrada, en función del número de bloques (2 bloques) se considerará como división de entrada para el procesamiento de MapReduce y se asignarán dos asignadores para este trabajo. Pero supongamos que ha especificado el tamaño dividido (digamos 100MB) en su progtwig MapReduce, entonces ambos bloques (2 bloques) se considerarán como una única división para el procesamiento MapReduce y se asignará un Mapper para este trabajo.

Supongamos ahora que ha especificado el tamaño dividido (digamos 25 MB) en su progtwig MapReduce, luego habrá 4 divisiones de entrada para el progtwig MapReduce y 4 Mapper se asignarán para el trabajo.

Conclusión:

  1. La división de entrada es una división lógica de los datos de entrada, mientras que el bloque HDFS es una división física de datos.
  2. El tamaño de bloque predeterminado de HDFS es un tamaño de división predeterminado si la división de entrada no se especifica a través del código.
  3. Split está definido por el usuario y el usuario puede controlar el tamaño dividido en su progtwig MapReduce.
  4. Una división puede mapearse a varios bloques y puede haber una división múltiple de un bloque.
  5. El número de tareas de mapa (Mapper) es igual al número de divisiones de entrada.

Fuente: https://hadoopjournal.wordpress.com/2015/06/30/mapreduce-input-split-versus-hdfs-blocks/