Proceso de lectura y escritura de HDFS
Esta es una pregunta indispensable para entrevistar a analistas de big data. Muchos entrevistadores no pueden hablar completamente
, así que por favor recuérdalo. Y muchos problemas se derivan del proceso de lectura y escritura de HDFS.
1. Proceso de lectura de HDFS
- El cliente envía una solicitud RPC a NameNode. La ubicación del bloque de archivo solicitado;
- Después de que NameNode reciba la solicitud, verificará los permisos de usuario y si existe este archivo. Si están todos en línea
, devolverá parte o la totalidad de la lista de bloqueo según la situación. Para cada bloque, NameNode
devolverá la dirección del DataNode que contiene la copia del bloque; la dirección del DataNode,
la distancia entre el DataNode y el cliente se obtendrán según la topología del clúster, y luego se ordenarán según
dos reglas: en la topología de red, el más cercano al Cliente se clasifica en primer lugar; en el mecanismo de latido,
el estado del DataNode informado en horas extras es STALE, dicha fila está detrás; - El cliente selecciona el Nodo de datos mejor clasificado para leer el bloque. Si el cliente en sí es
un Nodo de datos, obtendrá datos directamente del local (función de lectura de cortocircuito); - La esencia de la capa inferior es establecer un flujo de socket (FSDataInputStream) y llamar repetidamente
al método de lectura de la clase principal DataInputStream hasta que se lean los datos en este bloque; - Después de leer los bloques en la lista, si la lectura del archivo aún no ha terminado, el cliente continuará obteniendo
el siguiente lote de listas de bloques del NameNode; - Después de leer un bloque, se realizará la verificación de la suma de verificación.Si ocurre un error al leer el DataNode,
el cliente notificará al NameNode y luego
continuará leyendo desde el siguiente DataNode que tenga una copia del bloque; - El método de lectura lee la información del bloque en paralelo, no uno por uno, el NameNode solo
devuelve la dirección del DataNode del bloque solicitado por el Cliente, no los datos del bloque solicitado; - Finalmente, todos los bloques leídos se fusionarán en un archivo final completo;
2. Proceso de escritura HDFS
- Cliente El cliente envía una solicitud de carga y establece comunicación con el NameNode a través de RPC. El NameNode
verifica si el usuario tiene el permiso de carga y si el archivo cargado tiene el mismo nombre en el directorio HDFS correspondiente
. Si alguno de los dos no se cumple, se informará directamente un error. , si ambos están satisfechos,
devolver al cliente un mensaje que se puede cargar; - El cliente divide el archivo de acuerdo con el tamaño del archivo. El valor predeterminado es 128 M. Una vez que se completa la división, envía
una solicitud al NameNode en el servidor en el que se carga el primer bloque; - Después de que NameNode recibe la solicitud, asigna archivos de acuerdo con la topología de la red, la percepción del rack y el mecanismo de copia
, y devuelve la dirección del DataNode disponible; - Después de recibir la dirección, el cliente se comunica con un nodo en la lista de direcciones del servidor como A, que es esencialmente una
llamada RPC para establecer una canalización. A continuará llamando a B después de recibir la solicitud, y B
llamará a C para completar la establecimiento de todo el pipeline. , regreso al Cliente paso a paso; - El cliente comienza a enviar el primer bloque a A (primero lee los datos del disco y luego los coloca en la memoria
caché local), en la unidad de paquete (paquete de datos, 64kb), A recibe un paquete y lo envía a
B, y luego B envía Para C, A lo pondrá en una cola de respuesta para esperar la respuesta después de que se transmita cada paquete; - Los datos se dividen en paquetes individuales y se transmiten secuencialmente en la canalización.En la
transmisión inversa de la canalización, los acuses de recibo se envían uno por uno (respuesta correcta del comando) y, finalmente, el primer
nodo A de DataNode en la canalización envía el acuse de recibo de la canalización al Cliente; - Una vez que se completa la transmisión de un bloque, el Cliente solicita al NameNode que cargue el segundo bloque nuevamente, y
el NameNode selecciona tres DataNodes para el Cliente nuevamente.