Tutorial HDFS: Arquitectura, operación de lectura y 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 ejecuta en grupos de hardware básico. Es tolerante a fallos, escalable y extremadamente sencillo de ampliar. Hadoop viene incluido con HDFS (Sistemas de archivos distribuidos Hadoop).

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

Arquitectura HDFS

El clúster HDFS consta principalmente de un NodoNombre que gestiona el sistema de archivos metadatos y nodos de datos que almacena el Información actual.

  • NombreNodo: 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. dos archivos 'Imagen del espacio de nombres' y al 'editar registro' Se utilizan para almacenar información de metadatos. Namenode tiene conocimiento de todos los nodos de datos que contienen bloques de datos para un archivo determinado; sin embargo, no almacena ubicaciones de bloques de manera persistente. Esta información se reconstruye cada vez a partir de los nodos de datos cuando se inicia el sistema.
  • Nodo de datos: Los DataNodes son esclavos que residen en cada máquina de un clúster y proporcionan el almacenamiento real. Es responsable de atender, leer y escribir 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 fragmentos del tamaño de un bloque, que se almacenan como unidades independientes. El tamaño de bloque predeterminado es 64 MB.

HDFS opera según 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.

¿Sabes? Un archivo en HDFS, que es más pequeño que un solo bloque, no ocupa todo el almacenamiento de un bloque.

Leer operación en HDFS

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

Leer operación en HDFS

  1. Un cliente inicia una solicitud de lectura llamando 'abierto()' método del objeto FileSystem; es un objeto de tipo DistributedFileSystemDistributedFileSystem.
  2. Este objeto se conecta a namenode usando RPC y obtiene información de metadatos, como las ubicaciones de los bloques del archivo. Tenga en cuenta que estas direcciones pertenecen a 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, un objeto de tipo FSDataInputStream se devuelve al cliente. 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 'leer()' método que causa DFSInputStream para establecer una conexión con el primer DataNode con el primer bloque de un archivo.
  5. Los datos se leen en forma de secuencias en las que el cliente invoca 'leer()' método repetidamente. Este proceso de leer() La operación continúa hasta llegar al final del bloque.
  6. Una vez que se alcanza el final de un bloque, DFSInputStream cierra la conexión y continúa para localizar el siguiente DataNode para el siguiente bloque.
  7. Una vez que un cliente ha terminado con la lectura, llama un acercamiento() método.

Operación de escritura en HDFS

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

Operación de escritura en HDFS

  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, la operación de creación de este archivo no asocia ningún bloque con el archivo. Es responsabilidad de NameNode verificar que el archivo (que se está creando) no exista ya y que un cliente tenga los permisos correctos para crear un nuevo archivo. Si un archivo ya existe o el cliente no tiene permiso suficiente para crear un archivo nuevo, entonces IOException se lanza 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 ponen en cola en una cola que se llama como Cola de datos.
  5. Hay un componente más llamado Streamer de datos que consume esto Cola de datos. DataStreamer también solicita a NameNode la asignación de nuevos bloques, seleccionando así los DataNodes deseables para usar en la replicación.
  6. Ahora, el proceso de replicación comienza creando una canalización utilizando 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 de la tubería.
  8. Cada DataNode en una tubería almacena los paquetes que recibe y los reenvía al segundo DataNode en una tubería.
  9. DFSOutputStream mantiene otra cola, 'Ack Queue', para almacenar paquetes que están esperando el reconocimiento de DataNodes.
  10. Una vez que se recibe el reconocimiento de un paquete en la cola de todos los DataNodes en la canalización, se elimina de la "Cola de reconocimiento". En caso de falla de cualquier 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). La llamada a close() da como resultado el vaciado de los paquetes de datos restantes a la canalización y luego espera el reconocimiento.
  12. Una vez que se recibe el acuse de recibo final, se contacta a NameNode para informarle que la operación de escritura del archivo se ha completado.

Acceda a HDFS utilizando la API JAVA

En esta sección tratamos de entender Java Interfaz 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 JAVA. El paquete denominado org.apache.hadoop.fs contiene clases útiles para manipular 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 distintos de HDFS.

Leer un archivo desde HDFS, mediante programación

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 setURLStreamHandlerFactory método en el objeto URL y se le pasa una instancia de FsUrlStreamHandlerFactory. Este método debe ejecutarse sólo una vez por JVM, por lo tanto, está encerrado 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.

Acceda 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 admite operaciones del sistema de archivos, como leer el archivo, crear directorios, mover archivos, eliminar datos y enumerar directorios.

Podemos correr ‘$HADOOP_HOME/bin/hdfs dfs -ayuda’ 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 details de cada uno.

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

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

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

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

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

$HADOOP_HOME/bin/hdfs dfs -ls /

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

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

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

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

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

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

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

Compruebe si se crea un directorio o no. Ahora debes saber cómo hacerlo 😉