2012-02-13 23 views
15

Quiere confirmar simplemente lo siguiente. Verifique si esto es correcto: 1. Según tengo entendido, cuando copiamos un archivo en HDFS, ese es el momento en que el archivo (suponiendo que su tamaño> 64 MB = tamaño de bloque HDFS) se divide en múltiples fragmentos y cada fragmento se almacena en diferentes nodos de datos.Acerca de la división de archivos Hadoop/HDFS

  1. contenidos de archivos ya están divididos en trozos cuando el archivo se copia en HDFS y que el archivo de división no sucede en el momento de un trabajo en ejecución mapa. Las tareas del mapa solo están programadas de tal forma que funcionen en cada porción del máximo. tamaño 64 MB con ubicación de datos (es decir, la tarea de mapa se ejecuta en ese nodo que contiene los datos/fragmento)

  2. La división de archivos también ocurre si el archivo está comprimido (gzip) pero MR garantiza que cada archivo sea procesado por un solo asignador , es decir, MR recogerá todos los fragmentos del archivo gzip que se encuentran en otros nodos de datos y los dará a todos al mapeador único.

  3. Ocurrirá lo mismo que arriba si definimos isSplitable() para devolver falso, es decir, todos los fragmentos de un archivo serán procesados ​​por un asignador ejecutándose en una máquina. MR leerá todos los fragmentos de un archivo de diferentes nodos de datos y los pondrá a disposición de un solo mapeador.

+0

Un título más descriptivo sería una mejora bienvenida a su pregunta. –

Respuesta

10

Su comprensión no es ideal. Quiero señalar que hay dos procesos, casi independientes: dividir archivos en bloques HDFS y dividir archivos para que los diferentes mapeadores los procesen.
HDFS divide archivos en bloques según el tamaño de bloque definido.
Cada formato de entrada tiene su propia lógica de cómo los archivos se pueden dividir en partes para el procesamiento independiente por diferentes mapeadores. La lógica predeterminada de FileInputFormat es dividir archivos por bloques HDFS. Puede implementar cualquier otra lógica
La compresión, generalmente es un problema de división, por lo que empleamos la técnica de compresión de bloques para permitir la división de los datos comprimidos. Significa que cada parte lógica del archivo (bloque) se comprime de forma independiente.

+2

Hola David, gracias por esta aclaración. Si mi archivo se supone digamos 128 MB. Supongo que en este caso HDFS mantendrá dividido esto en dos partes, cada una de tamaño 64 MB (suponiendo HDFS tamaño de bloque = 64 MB). Estos pueden ser almacenados en diferentes máquinas. Ahora si uso mi propio FileInputFormat que acaba de extender TextInputFormat y devuelve false en "isSplitable()", ¿cuál será el comportamiento, es decir, habrá un solo mapeador que recibirá ambos fragmentos de entrada (es decir, un archivo completo procesado por un solo mapeador)) o habrá dos mapeadores cada uno procesando un pedazo de archivo. – sunillp

+0

Estoy confundido aquí, quería probarlo pero de alguna manera mi formato de entrada personalizado se está compilando pero no se está ejecutando en la configuración de la prueba. – sunillp

+2

If isSplitable devuelve falso: un mapeador procesará el archivo, independientemente de la cantidad de bloques. –

1

Sí, los contenidos de los archivos se dividen en fragmentos cuando el archivo se copia en el HDFS. El tamaño de bloque es configurable, y si es decir 128 MB, entonces 128 MB enteros serían un bloque, no 2 bloques de 64 MB por separado. Tampoco es necesario que cada fragmento de un archivo se almacene en un nodo de datos separado. datanode puede tener más de un fragmento de un archivo particular. Y un fragmento en particular puede estar presente en más de un nodo de datos en función del factor de replicación.

+0

Lea la pregunta con más cuidado: su respuesta no tiene nada que ver con el tema –

+0

¿Puedo preguntar de qué manera? El título en sí dice: división de archivos Hadoop/HDFS. Estoy de acuerdo en que no es tan bueno como la respuesta de David. Pero no encuentro nada que no esté relacionado con el tema. Por favor, házmelo saber para que no repita el error. Gracias. – Tariq

32

La respuesta de David casi da en el clavo, solo lo estoy elaborando aquí.

Hay dos conceptos distintos en el trabajo aquí, cada concepto es manejado por una entidad diferente en el marco hadoop

En primer lugar -

1) División de un archivo en bloques - Cuando un archivo está escrito en HDFS, HDFS divide el archivo en bloques y se encarga de su replicación. Esto se hace una vez (principalmente) y luego está disponible para todas las tareas de MR que se ejecutan en el clúster.Esta es una gran configuración de clúster

segundo lugar -

2) División de un archivo en la entrada se divide - Cuando la vía de entrada se pasa en un trabajo de MR, el trabajo MR utiliza la ruta junto con el formato de entrada configurado para dividir los archivos especificados en la ruta de entrada en divisiones, cada división es procesada por una tarea de mapa. El cálculo de las divisiones de entrada se realiza mediante el formato de entrada cada vez que se ejecuta un trabajo

Ahora que tenemos esto bajo nuestra correa, podemos entender que el método isSplitable() se incluye en la segunda categoría.

Para clavar realmente esto abajo echar un vistazo al flujo de datos de escritura HDFS (Concepto 1)

HDFS Write Data Flow

El segundo punto en el diagrama es probablemente donde ocurre la separación, tenga en cuenta que esto no tiene nada que ver con el funcionamiento de un MR trabajo

Ahora echar un vistazo a los pasos de ejecución de un trabajo MR

MR

Aquí el primer paso es el cálculo de las divisiones de entrada a través del formato de entrada configurado para el trabajo.

Gran parte de su confusión se debe al hecho de que está compartiendo estos dos conceptos, espero que esto lo aclare un poco.

Cuestiones relacionadas