Tutorial de HDFS: arquitectura, lectura y amp; Operación de escritura usando la API de Java

¿Qué es HDFS?

HDFS es un sistema de archivos distribuido para almacenar archivos de datos muy grandes, que se ejecutan en grupos de hardware básico. Es tolerante a fallas, escalable y extremadamente simple de expandir. Hadoop viene incluido con HDFS ( Hadoop Distributed File Systems ).

Cuando los datos exceden la capacidad de almacenamiento en una sola máquina física, se vuelve esencial dividirlos entre varias máquinas separadas. Un sistema de archivos que administra operaciones específicas de almacenamiento en una red de máquinas se denomina sistema de archivos distribuido. HDFS es uno de esos programas.

En este tutorial, aprenderemos,

  • ¿Qué es HDFS?
  • Arquitectura HDFS
  • Leer operación
  • Operación de escritura
  • Acceda a HDFS mediante la API de JAVA
  • Acceder a HDFS mediante la INTERFAZ DE LÍNEA DE COMANDOS

Arquitectura HDFS

El clúster HDFS consta principalmente de un NameNode que administra los metadatos del sistema de archivos y un DataNodes que almacena los datos reales .

  • NameNode: NameNode puede considerarse como un maestro del sistema. Mantiene el árbol del sistema de archivos y los metadatos de todos los archivos y directorios presentes en el sistema. Se utilizan dos archivos 'Imagen de espacio de nombres' y 'registro de edición' para almacenar información de metadatos. Namenode tiene conocimiento de todos los nodos de datos que contienen bloques de datos para un archivo dado, sin embargo, no almacena las ubicaciones de los bloques de manera persistente. Esta información se reconstruye cada vez a partir de los nodos de datos cuando se inicia el sistema.
  • DataNode: Los DataNodes son esclavos que residen en cada máquina en un clúster y proporcionan el almacenamiento real. Es responsable de atender, leer y escribir las solicitudes de los clientes.

Las operaciones de lectura / escritura en HDFS operan a nivel de bloque. Los archivos de datos en HDFS se dividen en bloques del tamaño de un bloque, que se almacenan como unidades independientes. El tamaño de bloque predeterminado es 64 MB.

HDFS funciona con un concepto de replicación de datos en el que se crean múltiples réplicas de bloques de datos y se distribuyen en nodos en todo un clúster para permitir una alta disponibilidad de datos en caso de falla del nodo.

¿Lo sabías? Un archivo en HDFS, que es más pequeño que un solo bloque, no ocupa el almacenamiento completo de un bloque.

Leer operación en HDFS

La solicitud de lectura de datos es atendida por HDFS, NameNode y DataNode. Llamemos al lector como 'cliente'. El siguiente diagrama muestra la operación de lectura de archivos en Hadoop.

  1. Un cliente inicia una solicitud de lectura llamando al método 'open ()' del objeto FileSystem; es un objeto de tipo DistributedFileSystem .
  2. Este objeto se conecta a namenode mediante RPC y obtiene información de metadatos, como las ubicaciones de los bloques del archivo. Tenga en cuenta que estas direcciones son de los primeros bloques de un archivo.
  3. En respuesta a esta solicitud de metadatos, se devuelven las direcciones de los DataNodes que tienen una copia de ese bloque.
  4. Una vez que se reciben las direcciones de DataNodes, se devuelve al cliente un objeto de tipo FSDataInputStream . FSDataInputStream contiene DFSInputStream que se encarga de las interacciones con DataNode y NameNode. En el paso 4 que se muestra en el diagrama anterior, un cliente invoca el método 'read ()' que hace que DFSInputStream establezca una conexión con el primer DataNode con el primer bloque de un archivo.
  5. Los datos se leen en forma de flujos en los que el cliente invoca el método 'read ()' repetidamente. Este proceso de operación read () continúa hasta que llega al final del bloque.
  6. Una vez que se alcanza el final de un bloque, DFSInputStream cierra la conexión y avanza para ubicar el siguiente DataNode para el siguiente bloque
  7. Una vez que un cliente ha terminado con la lectura, llama a un método close () .

Operación de escritura en HDFS

En esta sección, entenderemos cómo se escriben los datos en HDFS a través de archivos.

  1. Un cliente inicia la operación de escritura llamando al método 'create ()' del objeto DistributedFileSystem que crea un nuevo archivo - Paso no. 1 en el diagrama anterior.
  2. El objeto DistributedFileSystem se conecta al NameNode mediante una llamada RPC e inicia la creación de un nuevo archivo. Sin embargo, esta operación de creación de archivos no asocia ningún bloque con el archivo. Es responsabilidad de NameNode verificar que el archivo (que se está creando) no existe ya y que un cliente tiene los permisos correctos para crear un nuevo archivo. Si ya existe un archivo o el cliente no tiene permiso suficiente para crear un nuevo archivo, se lanza IOException al cliente. De lo contrario, la operación se realiza correctamente y NameNode crea un nuevo registro para el archivo.
  3. Una vez que se crea un nuevo registro en NameNode, se devuelve al cliente un objeto de tipo FSDataOutputStream. Un cliente lo usa para escribir datos en HDFS. Se invoca el método de escritura de datos (paso 3 en el diagrama).
  4. FSDataOutputStream contiene el objeto DFSOutputStream que se ocupa de la comunicación con DataNodes y NameNode. Mientras el cliente continúa escribiendo datos, DFSOutputStream continúa creando paquetes con estos datos. Estos paquetes se colocan en una cola que se llama DataQueue .
  5. Hay un componente más llamado DataStreamer que consume este DataQueue . DataStreamer también solicita a NameNode la asignación de nuevos bloques, seleccionando así los DataNodes deseables para la replicación.
  6. Ahora, el proceso de replicación comienza creando una canalización usando DataNodes. En nuestro caso, hemos elegido un nivel de replicación de 3 y, por lo tanto, hay 3 DataNodes en proceso.
  7. El DataStreamer vierte paquetes en el primer DataNode en la canalización.
  8. Cada DataNode en una canalización almacena el paquete recibido por él y lo reenvía al segundo DataNode en una canalización.
  9. DFSOutputStream mantiene otra cola, 'Ack Queue', para almacenar los paquetes que están esperando el reconocimiento de DataNodes.
  10. Una vez que se recibe el acuse de recibo de un paquete en la cola de todos los DataNodes en la canalización, se elimina de la 'Cola de Ack'. En el caso de cualquier falla de DataNode, los paquetes de esta cola se utilizan para reiniciar la operación.
  11. Una vez que un cliente termina con la escritura de datos, llama a un método close () (Paso 9 en el diagrama) Llamada a cerrar (), resulta en el vaciado de los paquetes de datos restantes en la canalización seguido de la espera de reconocimiento.
  12. Una vez que se recibe un acuse de recibo final, se contacta con NameNode para informarle que la operación de escritura del archivo se ha completado.

Acceda a HDFS mediante la API de JAVA

En esta sección, intentamos comprender la interfaz de Java utilizada para acceder al sistema de archivos de Hadoop.

Para interactuar con el sistema de archivos de Hadoop mediante programación, Hadoop proporciona múltiples clases de JAVA. El paquete llamado org.apache.hadoop.fs contiene clases útiles en la manipulación de un archivo en el sistema de archivos de Hadoop. Estas operaciones incluyen abrir, leer, escribir y cerrar. En realidad, la API de archivos para Hadoop es genérica y se puede ampliar para interactuar con otros sistemas de archivos que no sean HDFS.

Leer un archivo de HDFS mediante programación

El objeto java.net.URL se utiliza para leer el contenido de un archivo. Para empezar, necesitamos hacer que Java reconozca el esquema de URL hdfs de Hadoop. Esto se hace llamando al método setURLStreamHandlerFactory en el objeto URL y se le pasa una instancia de FsUrlStreamHandlerFactory. Este método debe ejecutarse solo una vez por JVM, por lo tanto, está incluido en un bloque estático.

Un código de ejemplo es-

public class URLCat {static {URL.setURLStreamHandlerFactory(new FsUrlStreamHandlerFactory());}public static void main(String[] args) throws Exception {InputStream in = null;try {in = new URL(args[0]).openStream();IOUtils.copyBytes(in, System.out, 4096, false);} finally {IOUtils.closeStream(in);}}}

Este código abre y lee el contenido de un archivo. La ruta de este archivo en HDFS se pasa al programa como un argumento de línea de comando.

Acceder a HDFS mediante la INTERFAZ DE LÍNEA DE COMANDOS

Esta es una de las formas más sencillas de interactuar con HDFS. La interfaz de línea de comandos tiene soporte para operaciones del sistema de archivos como leer el archivo, crear directorios, mover archivos, borrar datos y listar directorios.

Podemos ejecutar '$ HADOOP_HOME / bin / hdfs dfs -help' para obtener ayuda detallada sobre cada comando. Aquí, 'dfs' es un comando de shell de HDFS que admite múltiples subcomandos.

Algunos de los comandos más utilizados se enumeran a continuación junto con algunos detalles de cada uno.

1. Copie un archivo del sistema de archivos local a HDFS

$HADOOP_HOME/bin/hdfs dfs -copyFromLocal temp.txt /

Este comando copia el archivo temp.txt del sistema de archivos local a HDFS.

2. Podemos listar archivos presentes en un directorio usando -ls

$HADOOP_HOME/bin/hdfs dfs -ls /

Podemos ver un archivo 'temp.txt' (copiado anteriormente) que aparece en el directorio '/' .

3. Comando para copiar un archivo al sistema de archivos local desde HDFS

$HADOOP_HOME/bin/hdfs dfs -copyToLocal /temp.txt

Podemos ver temp.txt copiado a un sistema de archivos local.

4. Comando para crear un nuevo directorio

$HADOOP_HOME/bin/hdfs dfs -mkdir /mydirectory

Compruebe si se crea un directorio o no. Ahora, debes saber cómo hacerlo ;-)

Articulos interesantes...