Introducción a Big Data (2) Sistema de archivos distribuido Hadoop - Introducción a HDFS

1. ¿Qué es HDFS?

El sistema de archivos distribuidos de Hadoop (Sistema de archivos distribuidos de Hadoop, HDFS) es el subproyecto principal del proyecto Hadoop. Es la base de la gestión del almacenamiento de datos en la computación distribuida. Se desarrolla en función de los requisitos de acceso y procesamiento de archivos muy grandes en modo de transmisión de datos. Puede ejecutarse en servidores comerciales económicos. Tiene alta tolerancia a fallas, alta confiabilidad, alta escalabilidad y alto rendimiento. HDFS no es adecuado para aplicaciones que requieren acceso a datos de baja latencia, almacenamiento de una gran cantidad de archivos pequeños y escenarios en los que varios usuarios escriben o modifican archivos de forma arbitraria.

  • La computación distribuida es una ciencia que divide los datos de ingeniería que requieren una gran cantidad de cálculo en partes pequeñas y las calcula por separado en varias computadoras. Después de cargar los resultados del cálculo, los resultados se unifican y combinan para sacar conclusiones de los datos.
  • El sistema de archivos distribuidos (Distributed File System) es un sistema de archivos que se utiliza para administrar el almacenamiento en varias computadoras en la red.
  • Acceso al modo de transmisión de datos: HDFS adopta  un modo de acceso eficiente de "escribir una vez, leer muchas veces"  . El conjunto de datos generalmente se genera o copia de la fuente de datos, y luego se realizan varios análisis en este conjunto de datos durante mucho tiempo.Cada análisis involucra la mayor parte o la totalidad del conjunto de datos, por lo que el tiempo de retraso de leer todo el conjunto de datos es más importante que el tiempo de retraso de leer el primer registro. El libro aquí es relativamente oscuro, así que vamos a explicarlo brevemente. El acceso a datos de transmisión es para procesar una pequeña cantidad de datos (por ejemplo, transmitir durante la descarga), y el acceso a datos sin transmisión correspondiente es esperar a que todos los datos estén listos antes del procesamiento (por ejemplo, transmitir después de la descarga).
  • Acceso a datos de baja latencia: las aplicaciones que requieren acceso a datos de baja latencia, como decenas de milisegundos, no son adecuadas para ejecutarse en HDFS. Recuerde que HDFS está optimizado para aplicaciones de alto rendimiento de datos, lo que puede resultar en una mayor latencia. Actualmente, HBase es una mejor opción para los requisitos de acceso de baja latencia.
  • Una gran cantidad de archivos pequeños: los archivos pequeños generalmente se refieren a archivos cuyo tamaño de archivo es mucho más pequeño que el tamaño de bloque de HDFS. Si hay una gran cantidad de archivos pequeños, tendrá cierto impacto en todo el sistema de almacenamiento: (1) Dado que el nodo de nombres almacena los metadatos del sistema de archivos en la memoria, una gran cantidad de archivos pequeños agotará la memoria del nodo de nombres y afectará la capacidad de almacenamiento de archivos de HDFS; (2) si mapreduce se usa para procesar archivos pequeños, la cantidad de tareas de mapa aumentará y la cantidad de tiempos de direccionamiento aumentará.
  • Escritura multiusuario, modificación de archivos arbitrariamente: la escritura de archivos en HDFS solo admite un único escritor, y la operación de escritura siempre escribe datos al final del archivo de forma "solo agregada". No admite operaciones con múltiples escritores, ni admite modificaciones en ubicaciones arbitrarias en el archivo.

2. Análisis de conceptos relacionados con HDFS

  1.  Bloque (bloque): en el sistema operativo, cada disco tiene un tamaño de bloque de datos predeterminado, que es la unidad más pequeña para la lectura/escritura de datos en el disco ( término de almacenamiento informático: sector, bloque de disco, página ). HDFS también tiene el concepto de bloque (Block), pero mucho más grande, el valor predeterminado es de 128 MB (se puede configurar mediante dfs.blocksize). Al igual que el sistema de archivos en un solo disco, los archivos en HDFS también se dividen en varios fragmentos (Chunk) del tamaño del bloque como unidades de almacenamiento independientes. Pero a diferencia de un sistema de archivos para un solo disco, los archivos más pequeños que el tamaño de un bloque en HDFS no ocupan el espacio de un bloque completo . Por ejemplo, cuando un archivo de 1 MB se almacena en un bloque de 128 MB, el archivo solo usa 1 MB de espacio en disco en lugar de 128 MB (extensión: bloque, paquete, fragmento en HDFS ). Nota: Cuanto mayor sea el bloque de archivos, menor será el tiempo de búsqueda, pero mayor será el tiempo de transferencia del disco; cuanto menor sea el bloque de archivos, mayor será el tiempo de búsqueda, pero menor será el tiempo de transferencia del disco.
  2. Namenode (nodo de gestión): se utiliza para gestionar el espacio de nombres del sistema de archivos (espacio de nombres), que mantiene el árbol del sistema de archivos y todos los archivos y directorios de todo el árbol. Esta información se almacena permanentemente en el disco local en forma de dos archivos: el archivo de imagen del espacio de nombres (FSImage) y el archivo de registro de edición (Editlog). El nodo de nombre también registra la información del nodo de datos de cada bloque en cada archivo, pero no almacena de forma permanente la información de ubicación del bloque, porque la información se reconstruirá en función de la información del nodo de datos cuando se inicie el sistema.

  1. FSImage (archivo de imagen de espacio de nombres): FSImage guarda el último punto de control de metadatos y carga información de FSImage cuando se inicia HDFS , incluida información sobre todos los directorios y archivos en todo el sistema de archivos HDFS. Para un archivo incluye información de descripción del bloque de datos, tiempo de modificación, tiempo de acceso, etc.; para un directorio, incluye tiempo de modificación, información de control de acceso (el usuario al que pertenece el directorio, el grupo al que pertenece), etc. Los archivos fsimage generalmente se almacenan fsimage_con un prefijo.
  2. Editlogs (edición de archivos de registro): los Editlogs registran principalmente varias operaciones de actualización realizadas en HDFS cuando se ha iniciado NameNode , y todas las operaciones de escritura realizadas por el cliente HDFS se registrarán en Editlogs. El archivo de registros de edición generalmente se almacena edits_con un prefijo. Los archivos FSImage y Editlogs se almacenan en ${dfs.namenode.name.dir}/current/la ruta.
  3. Datanode (nodo de datos): Es el nodo de trabajo del sistema de archivos y el nodo que realmente almacena datos. Almacenan y recuperan bloques de datos según sea necesario (programado por los clientes o el nodo de nombre) y envían periódicamente al nodo de nombre una lista de los bloques que almacenan.
  4. Namenode secundario (nodo auxiliar/nodo de verificación): debido a que NameNode almacena metadatos a través de "FSImage + Editlogs", y los registros de edición solo se fusionarán en fsimage cuando NameNode se reinicie, para obtener la última instantánea de un sistema de archivos (punto de control: fusione el archivo de registro de edición en el archivo fsimage, el proceso de fusión se denomina punto de control ) . Pero en el entorno de producción, NameNode rara vez se reinicia, lo que significa que cuando NameNode se ejecuta durante mucho tiempo, el archivo de registros de edición será muy grande, lo que causará algunos problemas. Por ejemplo, reiniciar NameNode cuando sea necesario (como reiniciar NameNode después de un tiempo de inactividad) llevará mucho tiempo (los Editlogs deben fusionarse en FSImage). Para resolver este problema, necesitamos un mecanismo fácil de administrar que nos ayude a reducir el tamaño del archivo de registros de edición y obtener un archivo fsimage más reciente, lo que también reducirá la presión sobre NameNode. Esto es muy similar al punto de recuperación de Windows.El mecanismo de punto de recuperación de Windows nos permite tomar una instantánea del sistema operativo, de modo que cuando ocurre un problema en el sistema, podemos retroceder al último punto de recuperación. El Namenode secundario está aquí para ayudar a resolver los problemas anteriores. Lo hará regularmente (1 hora de forma predeterminada, que puede ser modificada por dfs.namenode.checkpoint.period; y dfs.namenode.checkpoint.txns, la configuración predeterminada es 1 millón, se usa para definir la cantidad de transacciones no verificadas en NameNode, lo que forzará un punto de control urgente, incluso si el período del punto de control aún no se ha alcanzado) desde Namenode para obtener FSImage y Edits y fusionar y luego envíe la última FSImage al Namenode.

HDFS adopta una arquitectura maestro/esclavo maestro-esclavo. Un clúster HDFS consta de un NameNode y una determinada cantidad de DataNodes. 

3. Proceso de escritura de archivos HDFS

Como se muestra en la figura anterior, HDFS se distribuye en tres racks Rack1, Rack2 y Rack3.

En este punto, suponga que hay un archivo FileA con un tamaño de 100 MB y el tamaño de bloque de HDFS es de 64 MB.

a.  El cliente envía una solicitud de escritura de datos a NameNode, como se muestra en la línea punteada azul ① en la figura anterior

b.  NameNode divide FileA en Block1 y Block2 por 64 MB de acuerdo con el tamaño del archivo y la configuración del bloque de archivos;

c.  El nodo NameNode devuelve el DataNode disponible de acuerdo con la información de dirección del DataNode y la política de detección de racks, como se muestra en la línea de puntos rosa ②. Extensión: Conciencia de bastidor HDFS

Nota: HDFS utiliza una estrategia denominada rack-aware para mejorar la confiabilidad de los datos, la disponibilidad y la utilización del ancho de banda de la red. De forma predeterminada, el factor de replicación es 3 (modificable a través de dfs.replication). La estrategia de almacenamiento de HDFS es almacenar una copia en un nodo en el bastidor local, una copia en otro nodo en el mismo bastidor y la última copia en un nodo en un bastidor diferente. Esta estrategia reduce la transferencia de datos entre bastidores y mejora la eficiencia de las operaciones de escritura. Los errores de rack son mucho menores que los errores de nodo, por lo que esta estrategia no afecta la confiabilidad y disponibilidad de los datos. Al mismo tiempo, esta estrategia reduce el ancho de banda general requerido para las transferencias de red al leer datos, porque los bloques de datos solo se almacenan en dos (no tres) bastidores diferentes.

Por lo tanto, la información devuelta de DataNode es la siguiente: el principio de proximidad en la topología de la red, si son todos iguales, seleccione aleatoriamente un DataNode

    Bloque 1: anfitrión 2, anfitrión 1, anfitrión 3

    Bloque 2: anfitrión7, anfitrión8, anfitrión4

D.  El cliente envía Block1 al DataNode, el proceso de envío es escritura de flujo. El proceso de escritura de transmisión es el siguiente:

        1> Divida el Bloque 1 de 64 MB en paquetes de 64 KB;

        2> Luego envíe el primer paquete a host2;

        3> Después de que host2 lo reciba, envía el primer paquete a host1 y, al mismo tiempo, el cliente envía el segundo paquete a host2;

        4> Después de que host1 recibe el primer paquete, lo envía a host3 y recibe el segundo paquete de host2 al mismo tiempo.

        5> Y así sucesivamente, como se muestra en la línea roja sólida de la figura, hasta que se envíe block1.

        6> host2, host1, host3 envían una notificación al NameNode, host2 al Cliente, diciendo "el mensaje ha sido enviado". Se muestra mediante la línea rosa sólida en la figura.

        7> Después de recibir el mensaje de host2, el cliente envía un mensaje al namenode, diciendo que he terminado de escribir. Eso es todo. gruesa linea amarilla

        8> Después de enviar el bloque 1, envíe el bloque 2 a host7, host8 y host4, como se muestra en la línea continua azul de la figura.

        9> Después de enviar block2, host7, host8 y host4, envíe notificaciones a NameNode y host7 a Client, como se muestra en la línea continua de color verde claro en la figura.

        10> El cliente envía un mensaje al NameNode, diciendo que terminé de escribir, como se muestra en la línea continua gruesa amarilla en la figura. Eso es todo.

4. Proceso de lectura de archivos HDFS

La operación de lectura es relativamente simple.Como se muestra en la figura anterior, FileA consta de block1 y block2. En este punto, el cliente lee FileA de DataNode de la siguiente manera:

a.  El cliente envía una solicitud de lectura al namenode.

b.  El namenode verifica la información de los metadatos de Metadata y devuelve la ubicación del bloque de FileA.

    Bloque 1: anfitrión 2, anfitrión 1, anfitrión 3

    Bloque 2: anfitrión7, anfitrión8, anfitrión4

C.  La posición del bloque es secuencial, primero lea el bloque 1, luego lea el bloque 2. Y block1 lee en host2, luego block2 lee en host7;

En el ejemplo anterior, el cliente está ubicado fuera del rack, por lo que si el cliente está ubicado en un DataNode dentro del rack, por ejemplo, el cliente es host6. Entonces, a la hora de leer, la regla a seguir es: preferentemente leer los datos de este rack .

conclusión V

El proceso de lectura y escritura de HDFS parece que la escritura aquí no es muy completa. Estoy publicando algunas direcciones de blog:

Introducción al proceso de lectura y escritura de HDFS, ¿cuál es el principio de lectura y escritura de datos de HDFS?

Proceso de lectura y escritura HDFS (el más refinado y detallado de la historia)

Proceso de escritura de archivo HDFS (los detalles deben verse)

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_37771475/article/details/116596652
Recomendado
Clasificación