Notas de estudio de Hadoop: HDFS


introducción

HDFS (Sistema de archivos distribuidos de Hadoop) es un sistema de archivos que realiza el almacenamiento distribuido de archivos en múltiples hosts a través de la red. Adopte el modo "cliente/servidor" (Cliente/Servidor).


1. Características básicas

1.1 Alta tolerancia a fallas

HDFS diseña los mecanismos correspondientes para la detección y recuperación de errores rápida y automática. Si un nodo falla, las copias de seguridad en otros nodos se reponen automáticamente.

1.2 Gran capacidad de datos

Admite cientos de nodos para satisfacer las necesidades de big data.

1.3 Escalabilidad

La escalabilidad horizontal es sólida y los nodos de datos se pueden agregar o eliminar según sea necesario.

1.4 Alto rendimiento

Alta tasa de transferencia de datos, compatible con aplicaciones de big data concurrentes.

1.5 Cálculo más cercano

Los clientes solicitan completar las tareas informáticas directamente en los nodos de datos tanto como sea posible, para reducir la carga de transmisión de datos y aumentar el rendimiento.

2. Arquitectura

Arquitectura de HDFS

2.1 Nodo de nombre

NameNode mantiene el árbol de directorios de archivos de todo el sistema de archivos, incluidos los metadatos de archivos/directorios y una lista de bloques de datos correspondientes a cada archivo, y es responsable de recibir las solicitudes de operación de los usuarios. Sus tareas principales son las siguientes:
(1) Administrar el espacio de nombres (Namespace);
(2) Controlar el cliente para leer/escribir archivos;
(3) Realizar operaciones comunes del sistema de archivos.

Se guardan dos estructuras de datos centrales, FsImage y EditLog. FsImage se utiliza para mantener los metadatos del árbol del sistema de archivos y todos los archivos y directorios en el árbol de archivos ; el archivo de registro de operaciones EditLog registra todas las operaciones, como la creación, eliminación y cambio de nombre de archivos Cuando se inicie NameNode, cargará el contenido del archivo FsImage en la memoria y luego realizará varias operaciones en EditLog para mantener actualizados los metadatos en la memoria.

2.2 Nodo de datos

DataNode almacena datos HDFS en forma de archivos en un archivo separado en el sistema de archivos local, no en el mismo directorio, y no conoce información sobre los archivos HDFS.

3. Mecanismo de almacenamiento

3.1 Bloque

Los datos en HDFS se almacenan en forma de bloque de archivo , que es la unidad más pequeña para cada lectura y escritura. El tamaño predeterminado de Hadoop 2.0 es de 128 MB. Puede modificar el tamaño del bloque configurando el parámetro dfs.blocksize en hdfs-site.xml , que debe ser 2 elevado a la késima potencia.

3.2 Estrategia de gestión de copias

Se utilizan varias copias para almacenar datos de forma redundante, y varias copias de un bloque de datos se almacenan en diferentes DataNodes. De forma predeterminada, cada bloque tiene tres copias. El principio básico de ubicación es garantizar que no todas las copias estén en la misma máquina. en el estante . Por ejemplo:
la primera copia está en el nodo donde se encuentra el cliente, la segunda copia está en otro nodo en el mismo bastidor y la tercera copia se coloca en un nodo aleatorio en otro bastidor.

4. Proceso de lectura y escritura de datos

4.1 Proceso de lectura de datos

Proceso de lectura de datos HDFS
①Abrir el archivo . Utilice el método open() del objeto DistributedFileSystem para abrir un archivo en HDFS;
Obtenga información del bloque de datos . Envíe una solicitud al NameNode a través de la llamada RPC (Remote Procedure Call) para obtener la información de ubicación del archivo, es decir, el número de bloque de datos y la dirección del DataNode; ③ lea
la solicitud . El cliente envía una solicitud de lectura () para leer datos a FSDataInputStream;
leer datos . DFSInputStream selecciona el bloque de datos más reciente para leer y lo devuelve al cliente, y cierra la conexión de DataNode correspondiente después de completar la lectura;
⑤Leer datos . DFSInputStream selecciona el DataNode más cercano a su vez, lee y regresa hasta que se lee el último bloque de datos (si un DataNode falla, automáticamente seleccionará el siguiente DataNode que contiene este bloque de datos para leer); ⑥Cerrar
el archivo . Después de que el cliente haya leído todos los bloques de datos, llame al método close() de FSDataInputStream para cerrar el archivo;

4.2 Proceso de escritura de datos

Proceso de escritura de datos HDFS
Crear una solicitud de archivo . El cliente llama al método create() del objeto FileSystem para crear un archivo;
Crear metadatos de archivo . Utilice RPC (llamada a procedimiento remoto) para llamar al nodo de nombre y crear un nuevo archivo en el espacio de nombres del sistema de archivos;
Escribir datos . A través del objeto FSDataOututStream, comience a escribir datos;
④Escriba paquetes de datos . Los datos se dividen en bloques mediante DFSOutputStream y se escriben en la cola de datos. Data Streamer lee la cola de datos y notifica al nodo de nombre que asigne nodos de datos para almacenar bloques de datos (tres bloques se replican de forma predeterminada para cada bloque). Los nodos de datos asignados se colocan en una canalización de flujo de datos . Data Streamer escribe el bloque de datos en el primer nodo de datos en la canalización, y el primer nodo de datos envía el bloque de datos al segundo nodo de datos, es decir, escribe mientras almacena ;
Recibe el paquete de confirmación . DFSOutputStream guarda la cola de acuse de recibo de los bloques de datos enviados y espera a que los nodos de datos en la canalización informen que los datos se escribieron correctamente;
⑥Cierre el archivo . Después de escribir todos los datos, llame a close() para escribir todos los bloques de datos en los nodos de datos en la canalización y espere a que la cola de acuse de recibo regrese con éxito; ⑦ La operación de escritura
se completa . Notifique al nodo de nombre que se completó la escritura;

5. Programación de la API de Java

//从URL读取HDFS文件
public class HDFSURLReader{
    
    
	static{
    
    
		//此处设置文件系统配置为URL流,仅执行一次
		URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());
		}
	public static void main(String[] args){
    
    
		InputStream stream = null;
		String hdfssurl = "hdfs://192.168.18.130:9000/data/input.txt");
		try{
    
    
			//打开远程HDFS文件系统的文件
			stream = new URL(hdfsurl).openStream();
			//输出文件内容到标准输出(默认为屏幕)
			IOUtils.copyBytes(stream, Ststem.out, 1024, false);
			}catch(IOException e){
    
    
				IOUtils.colseStream(stream);// 关闭文件
				}
			}
		}

6. Mecanismo de alta confiabilidad de HDFS

6.1 Mecanismo de latido

HDFS detecta si DataNode tiene un error a través del latido. Cada nodo DataNode envía periódicamente una señal de latido al NameNode, y el NameNode confirma si el DataNode tiene un error a través de la detección de la señal de latido y se les envían solicitudes de E/S. Cuando el tiempo de inactividad hace que el número de réplicas sea inferior al esperado, NameNode iniciará la operación de replicación.

6.2 Nodo de nombre secundario

El NameNode secundario (2NN) se usa principalmente para fusionar el EditLog de NameNode en el archivo FsImage, es decir, para actualizar y hacer copias de seguridad de los metadatos con regularidad . Evite que el reinicio tarde mucho tiempo cuando el archivo EditLog es demasiado grande. El proceso detallado es el siguiente:
①NameNode secundario notifica a NameNode que cambie los archivos de EditLog;
②NameNode secundario descarga FsImage y EditLog de NameNode a través de la red;
③NameNode secundario carga FsImage en la memoria y luego comienza a fusionar los registros de EditLog; ④NameNode
secundario devuelve el nuevo FsImage a NameNode;
El nuevo FsImage reemplaza al antiguo FsImage;

6.3 Mecanismo de alta disponibilidad de HDFS NameNode HA

HDFS NameNode HA (alta disponibilidad) HDFS NameNode mecanismo de alta disponibilidad para resolver el problema del único punto de falla de NameNode.
Mecanismo HDSF NamNode HA
1) Clúster de ZooKeeper : proporciona soporte de elección activo y en espera para controladores de conmutación activos y en espera;
2) controlador de conmutación activo/en espera (ZKFailoverController activo/en espera, ZKFC): detecta el estado de salud de NameNode a tiempo, administra sesiones y usa ZooKeeper automáticamente elige y cambia entre activo y en espera;
3) NameNode activo/en espera (Active/Standby NameNode): Active NameNode es responsable de todas las operaciones del cliente, Standby NameNode actúa como un esclavo y es responsable de mantener la información de estado para cambiar rápidamente cuando sea necesario; 4 ) Sistema de almacenamiento
compartido (clúster JournalNode): Sincronice el estado de NameNode activo/en espera. Use un grupo de procesos independientes llamado "JournalNode" para comunicarse, de modo que Standby NameNnode lea el EditLog de él y lo aplique a su propio espacio de nombres para lograr la sincronización de estado; 5) DataNode: DataNode informará la información de ubicación del bloque de datos a el NameNode activo y en espera al mismo tiempo, pero solo recibe comandos de lectura y escritura del NameNode principal;


Resumir

Lo anterior es el contenido sobre HDFS, bienvenido a agregar en el área de comentarios.

Consulte "Principios y aplicaciones de Big Data de Hadoop" Xu Luhui

Supongo que te gusta

Origin blog.csdn.net/weixin_49588575/article/details/128905159
Recomendado
Clasificación