2010-05-14 8 views
31

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 el formato <k,v> donde k es el desplazamiento de la línea desde el principio y el valor es el contenido de la línea.¿Cómo realiza Hadoop las divisiones de entrada?

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 hacen 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

Respuesta

23

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.

Para resumir: Cargue los datos en el HDFS y empiece un trabajo de MR. Hadoop cuidará la ejecución optimizada.

+0

¿El asignador en una máquina de acceso a los datos en otras máquinas demasiado o simplemente procesa los datos en su máquina? – Deepak

+0

El ejemplo predeterminado de conteo de palabras en el sitio de Hadoop no usa InputFormat. ¿Qué sucede si llamo a n tareas de mapa en ese ejemplo? ¿Cada tarea de mapa accede a todo el contenido del archivo? Gracias de nuevo. – Deepak

+1

Antes que nada, gracias por la votación :-) --- El ejemplo de wordcount usa TextInputFormat, que debería ser una subclase de InputFormat. --- Dado que el número de divisiones coincide con el número de mapeadores, cada mapeador procesará muy probablemente los datos más cercanos a él. Por supuesto, él podría acceder a otras máquinas, pero esto se evita debido a sus costos. –

14

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á escoger 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.

0

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

La forma en que me acerco a esta pregunta es mirando a su clase TextInputFormat defecto:

Todas las clases son InputFormat subclase de FileInputFormat, que se ocupan de la escisió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.

1

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

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

0

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.

3

Creo que lo que Deepak estaba pidiendo era más acerca de cómo se determina la entrada para cada llamada de la función de mapa, en lugar de los datos presentes en cada mapa nodo. Lo digo basado en la segunda parte de la pregunta: Más específicamente, cada vez que se llama a la función map(), ¿cuál es su clave y los parámetros Value val?

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

Para responder a la pregunta,

el archivo en un nodo mapa dado se divide, en función del valor que nos fijamos para InputFormat. (esto se hace en Java utilizando 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.

0

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

conf.setInputFormat (TextInputFormat.class);

clase FileInputFormat funcation addInputPath, setInputFormat cuidar de inputsplit, también este código define el número de creadores de mapas 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.

Ej. 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.

8

Afortunadamente, todo se encargará del framework.

procesamiento de datos MapReduce es impulsado por este concepto de de entrada se divide. 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 localidad de datos no se puede lograr debido a la entrada se divide cruzar los límites de los nodos de datos, algunos datos se transferirán desde un nodo de datos a otro nodo de datos.

Supongamos que hay 128 bloques MB y último registro no encajaba en Bloquear un y se extiende en bloque B, entonces los datos en bloque B se copiarán al nodo que tiene Bloquear un

Eche un vistazo a este diagrama.

enter image description here

Tenga una mirada en quesitons relacionados

About Hadoop/HDFS file splitting

How does Hadoop process records split across block boundaries?

1

Cuando se ejecuta un trabajo Hadoop, que dividir archivos de entrada en trozos y asignar a cada fracción a un asignador de proceso; esto se llama InputSplit.

0

Diferencia entre el tamaño del bloque y el tamaño de la entrada dividida.

División de entrada es la división lógica de sus datos, básicamente utilizada durante el procesamiento de datos en el programa 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).

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

Ejemplo:

Suponga que tiene un archivo de 100 MB y la configuración de bloque por defecto es de 64 MB HDFS entonces será picada en 2 dividir y ocupar dos bloques HDFS. Ahora tiene un programa 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 programa 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 programa MapReduce, luego habrá 4 divisiones de entrada para el programa MapReduce y 4 Mapper se asignarán para el trabajo.

Conclusión:

  1. de Split 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 los 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 es definido por el usuario y el usuario puede controlar el tamaño dividido en su programa MapReduce.
  4. Una división puede mapear 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/

Cuestiones relacionadas