Proceso de lectura y escritura HDFS y problema de escritura multiproceso

1 、 HDFS 之 bloque de paquete de bloques

Para comprender el proceso de lectura y escritura de hdfs, primero debemos comprender los conceptos de bloque, paquete y fragmento.

  • 1. Bloque,
    todos deben saber que el archivo debe dividirse en bloques antes de cargarlo. Este bloque es un bloque, que generalmente es de 128 MB. Por supuesto, puede cambiarlo, independientemente de no recomendarlo. Porque el bloque es demasiado pequeño: el tiempo de direccionamiento es demasiado alto. El bloque es demasiado grande: las tareas de mapa son muy pocas, la velocidad de ejecución del trabajo se vuelve lenta. Es la unidad más grande.
  • 2. El paquete
    paquete es la segunda unidad más grande. Es la unidad básica para que el cliente transfiera datos entre DataNode o DataNode PipLine . El valor predeterminado es 64 KB .
  • 3. Chunk
    chunk es la unidad más pequeña. Es la unidad básica para que el cliente verifique los datos entre DataNode o PipLine of DataNode. El valor predeterminado es 512 Byte. Debido a que se utiliza para la verificación, cada trozo debe tener un dígito de verificación de 4 Bytes . Por lo tanto, el tamaño real de cada paquete de escritura de fragmentos es de 516 Bytes .

2. Proceso de escritura HDFS

Inserte la descripción de la imagen aquí

  • 1. Utilice el Cliente Cliente proporcionado por HDFS para iniciar una solicitud RPC al Namenode remoto .
  • 2. Namenode verificará si el archivo que se creará ya existe y si el creador tiene permiso para operar. Si tiene éxito, el archivo creará un registro, de lo contrario el cliente lanzará una excepción.
  • 3. Cuando el cliente comienza a escribir el archivo, el cliente lo dividirá en múltiples paquetes , y gestionará internamente estos paquetes en forma de una "cola de datos" y luego aplicará al Namenode para bloques para obtener el almacenamiento para la replicación Lista de nodo de datos apropiada, el tamaño de la lista depende del valor de replicación en Namenode.
  • 4. Comience a escribir el paquete en todas las réplicas en forma de canalización. El cliente escribe el paquete en el primer nodo de datos en una secuencia. Después de que el nodo de datos almacena el paquete, se pasa al siguiente en esta canalización. Datanode, hasta el último datanode, esta forma de escribir datos es en forma de una tubería.
  • 5. Después de que el último nodo de datos se haya almacenado con éxito, devolverá un paquete ack (paquete de confirmación) , que se pasa al cliente en la tubería. La "cola ack" se mantiene en la biblioteca de desarrollo del cliente. Después de recibir con éxito el paquete ack devuelto por el nodo de datos, será "Ack queue" elimina el paquete correspondiente.
  • 6. Si un nodo de datos falla durante el proceso de transmisión, la tubería actual se cerrará, el nodo de datos fallido se eliminará de la tubería actual y los bloques restantes continuarán siendo canalizados en los nodos de datos restantes. En forma de transmisión, al mismo tiempo Namenode asignará un nuevo nodo de datos, manteniendo el número establecido por las réplicas .
  • 7. Cuando se completa la transmisión de un bloque, el cliente nuevamente solicita a NN que cargue el servidor del segundo bloque.
  • 8. Una vez que el cliente termina de escribir los datos, llamará a close () en el flujo de datos para cerrar el flujo de datos.
  • 9. Envíe una señal de finalización al NameNode.
    (Nota: El momento de enviar una señal de finalización al NameNode depende de si el clúster tiene una consistencia fuerte o una consistencia final. La consistencia fuerte requiere que todos los DataNodes se escriban antes de que se informen al NameNode. Para la consistencia final, se puede escribir cualquiera de los DataNodes. Para informar a NameNode por separado, HDFS generalmente enfatiza una fuerte consistencia )

3. Proceso de lectura de HDFS

Inserte la descripción de la imagen aquí

  • 1. Comuníquese con NN para consultar metadatos (el nodo del DN donde se encuentra el bloque) para encontrar el servidor del DN donde se encuentra el bloque de archivos.
  • 2. Elija un servidor DN (principio cercano, luego aleatorio) y solicite establecer una secuencia de entrada.
  • 3. DN comienza a enviar datos (leer datos del disco y ponerlos en la secuencia, se usa un paquete para la verificación).
  • 4. Cuando se complete la lectura de este bloque de datos, cierre la conexión a este nodo de datos y luego conéctese al nodo de datos más cercano del siguiente bloque de datos en este archivo.
  • 5. Cuando el cliente haya terminado de leer los datos, llame a la función de cierre de FSDataInputStream.

Durante el proceso de lectura, si ocurre un error cuando FSDataInputStream se comunica con un nodo de datos, intentará el siguiente bloque más cercano y también recordará el nodo de datos donde ocurrió el error en este momento. Haga intentos innecesarios en este nodo de datos .

DFSInputStream también en DataNode número de verificación (checknums) la salida a la transmisión de datos, si no se encuentra el bloque dañado, los intentos tienen datos DataNode DFSInputStream copia de seguridad en el bloque de copia de seguridad que se lee de otra .

4. Error de DataNode durante la escritura de datos HDFS

Si la escritura de datos en el DataNode falla, se realizarán las siguientes operaciones:

  • 1. La tubería de flujo de datos de Pipeline se cerrará y los paquetes en la cola ACK se agregarán al frente de la cola de datos para garantizar que no se pierda ningún paquete .
  • 2. La versión de ID del bloque guardado en el nodo DataNode normal se actualizará , de modo que los datos del bloque en el nodo DataNode fallido se eliminarán después de que el nodo vuelva a la normalidad, y el nodo fallido también se eliminará de la canalización .
  • 3. Los datos restantes se escribirán en los otros dos nodos en la tubería de la tubería .

5. ¿Puede HDFS escribir en múltiples hilos?

La respuesta es:
no se puede escribir simultáneamente con hdfs significa que solo puede haber un escritor para los archivos con el mismo nombre y ubicación, de lo contrario, todas las solicitudes de carga fallarán .
Los archivos en diferentes ubicaciones o con diferentes nombres se pueden cargar al mismo tiempo .

¿Cómo mantener la integridad de los datos durante la lectura y la escritura?

Pase la suma de control . Debido a que cada fragmento tiene un dígito de verificación, cada fragmento forma un paquete, y cada paquete finalmente forma un bloque, por lo que la suma de verificación se puede encontrar en el bloque.

El lado del cliente de HDFS implementa una verificación de suma de verificación del contenido de los archivos HDFS. Cuando el cliente crea un nuevo archivo HDFS, la suma de verificación de cada bloque de datos del archivo se calcula después de dividir el bloque, que se almacena en el mismo espacio de nombres HDFS que un archivo oculto. Cuando el cliente lee el contenido del archivo de HDFS, comprueba si la suma de comprobación calculada en el bloque (archivo oculto) coincide con la suma de comprobación en la lectura del bloque de archivos. Si no coincide, el cliente puede Elija obtener una copia del bloque de datos de otro Datanode.

El formato específico de la estructura de directorios del bloque de archivos en HDFS es el siguiente:

$ {dfs.datanode.data.dir} /
├── actual
│ ├── BP-526805057-127.0.0.1-1411980876842
│ │ └── actual
│ │ ├── VERSIÓN
│ │ ├── finalizado
│ │ │ ├ ── blk_1073741825
│ │ │ ├── blk_1073741825_1001.meta
│ │ │ ├── blk_1073741826
│ │ │ └── blk_1073741826_1002.meta
│ │ └── rbw
│ └── VERSIÓN
└── in_use.lock

in_use.lock significa que DataNode está operando en la carpeta.
rbw significa "réplica en escritura". Este directorio se utiliza para almacenar los datos que el usuario está escribiendo actualmente.
El archivo de metadatos de bloque (* .meta) consiste en un archivo de encabezado que contiene información de versión y tipo y una serie de valores de verificación. La suma de comprobación también está ahí.

Publicado 9 artículos originales · elogiado 0 · visitas 62

Supongo que te gusta

Origin blog.csdn.net/yangbllove/article/details/105567892
Recomendado
Clasificación