Skip to content

Comandos y operaciones básicas en HDFS

🚀 Presentación: HDFS

Hay que asegurarse que está arrancado HDFS

El comando hdfs se encuentra de la carpeta /opt/hadoop/biny el sistema busca en esta carpeta porque la habíamos incluido en nuestro $PATH.

Mostramos todas las opciones posibles del comando hdfs dfs. El comando hdfs “emula” comandos Linux como verás posteriormente.

Terminal window
$ echo $PATH
$ hdfs dfs #Muestra todos los comandos posibles

Para visualizar el contenido actual del sistema de ficheros HDFS.

Terminal window
$ hdfs dfs -ls /

EJERCICIO 1

  • Crear un fichero simple en local (prueba.txt).
  • Crear un directorio en el sistema de ficheros DFS (/temporal)
  • Copiar el archivo que hemos creado al directorio remoto.

Desde el explorador la web de administración, podemos ver información del archivo y bloques.

Nos fijamos en Bloock ID y Bloock Pool

¿Cómo hacerlo a través de un comando?

Terminal window
$ hdfs fsck /temporal/prueba.txt -files -blocks
Connecting to namenode via http://debianh:9870/fsck?ugi=hadoop&files=1&blocks=1&path=%2Fhola.txt
FSCK started by hadoop (auth:SIMPLE) from /127.0.0.1 for path /hola.txt at Mon Nov 06 14:08:52 CET 2023
/temporal/prueba.txt 5 bytes, replicated: replication=1, 1 block(s): OK
0. **BP-673766993-127.0.1.1-1698337131957**:blk_**1073741825**_1001 len=5 Live_repl=1

Ahora vamos a comprobar cómo HDFS ha guardado el archivo en local. Para ello vamos a:

Terminal window
$ cd /datos/datanode/current

Encontraremos una carpeta con el mismo nombre que el Bloock Pool, en mi caso entraré con:

Terminal window
cd BP-673766993-127.0.1.1-1698337131957
# Accedemos a sus subdirectorios
cd current/finalized/subdir0/subdir0/

En este momento podremos ver el bloque que debe encajar con el Block ID

Terminal window
$ ls
blk_1073741825
$ cat blk_1073741825
hola

Podemos borrar todo recursivamente con:

Terminal window
hdfs dfs -rm -r /temporal

Podéis encontrar los archivos de datos en el siguiente repositorio: https://github.com/josepgarcia/datos

  • Descargamos un fichero más grande (access_log.gz )
  • Lo descomprimimos. Quedará un archivo de 482mb.
  • Lo movemos a HDFS, dentro la carpeta
  • Comprobamos en cuantos bloques se encuentra.
  • ¿A qué archivos apunta en el contendor?
  1. Crea un fichero saludo.txt en local, que contenga el texto “Hola”. Súbelo a HDFS, a la carpeta /temporal (si no existe hay que crearla) Borra el fichero en local Muestra el contenido del fichero (en remoto).
  2. Copia el fichero saludo.txt a local con el nombre (saludolocal.txt)
  3. Entra a la web de administración para ver que existe el fichero.
  4. Borra el fichero remoto.
  5. Asegúrate que se ha borrado el fichero con ls.
  6. Borra el directorio temporal.
  1. Crea un fichero “otrosaludo.txt” en local, que contenga el texto “Hola”. MUÉVELO a HDFS, dentro de la carpeta /ejercicios/saludos/ Comprueba que ya no existe el fichero en local
  2. Crea un directorio en local llamado prueba Dentro de este directorio crea un fichero llamado ejercicioprueba.txt Mueve todo el directorio prueba a HDFS, dentro de la carpeta /ejercicios Comprueba que ya no existe la carpeta en local Realiza una copia de HDFS a local de la carpeta que acabas de subir.
  1. Crea un archivo en /tmp llamado archivogrande que tenga un tamaño de 500MB (aproximadamente)

    TIP: Utiliza el comando dd para crear el fichero

  2. Crea una carpeta en HDFS llamada datos2.

  3. Sube el archivo a la carpeta creada.

Con la herramienta dfsadmin podemos examinar el estado del cluster HDFS.

Terminal window
$ hdfs dfsadmin
# Ejemplo:
$ hdfs dfsadmin -safemode enter

Opciones dfsadmin

  1. hdfs dfsadmin -report: Resumen completo del sistema HDFS; estado de todos los nodos del clúster, su capacidad, el espacio utilizado…
  2. hdfs fsck: Comprobar la integridad del sistema de archivos HDFS. Para verificar un directorio hay que añadirlo como segundo parámetro. hdfs fsck /datos/prueba
  3. hdfs dfsadmin -printTopology: Este comando revela la topología del clúster HDFS. Proporciona información sobre la distribución de nodos y muestra a qué rack pertenece cada nodo.
  4. hdfs dfsadmin -listOpenFiles: Una tarea crítica en la administración de HDFS es garantizar que no haya archivos abiertos que puedan causar problemas en el sistema. Este comando lista todos los archivos abiertos en el clúster, lo que facilita la identificación y solución de problemas.
  5. hdfs dfsadmin -safemode enter: El modo seguro de HDFS es una característica importante para prevenir modificaciones accidentales en el sistema de archivos. Al ingresar al modo seguro, se evita la escritura y modificación de datos en el clúster. Esto puede ser útil durante operaciones de mantenimiento o actualizaciones críticas.
  6. hdfs dfsadmin -safemode leave: Cuando se completa la operación en modo seguro y se requiere que el sistema vuelva a estar en pleno funcionamiento, se puede salir del modo seguro con este comando.
  1. Muestra un resumen de recursos.
  2. Comprueba el estado del sistema de ficheros.
  3. Comprueba el estado del directorio datos2.
  4. Muestra la topología actual. Hadoop es consciente de los racks que tiene la máquina (se lo decimos nosotros), así organiza mejor los bloques (los replica en racks distintos)
  5. ¿Hay algún fichero abierto?
$ hdfs dfsadmin -report
"Under replicated blocks" -> Si configuramos como réplica por ejemplo 3 y hay algún bloque con menos. Si esto baja de un determinado porcentaje, hadoop se pone en modo seguro porque piensa que hay algún problema.
$ hdfs fsck /
$ hdfs fsck /datos2
$ hdfs dfsadmin -printTopology
$ hdfs dfsadmin -listOpenFiles

En esta práctica vamos a realizar un snapshot y utilizarlo para recuperar un fichero que hemos borrado accidentalmente.

Pasos a seguir:

  1. Creamos un directorio llamado datos dentro de DFS
  2. Subimos a ese directorio un fichero llamado f1.txt que contenga “Esto es una prueba”.

Ahora vamos a ver dónde ha dejado este fichero:

  • ¿Cómo se localiza el fichero desde webdfs?
  • ¿Cómo se localiza el fichero desde la línea de comandos?

Solución $ hdfs fsc /datos/f1.txt -blocks -locations -files

  1. Activamos para que se puedan hacer snapshots y realizamos uno
Terminal window
hdfs dfsadmin -allowSnapshot /datos
hdfs dfs -createSnapshot /datos snap1
## La creación del snapshot no se hace con dfsadmin sino con dfs
hdfs dfs -ls /datos/.snapshot/snap1
## Nos muestra el fichero tal y como estaba cuando hicimos el snap
  • ¿El snapshot aparece en webdfs? Compruébalo

Una vez tenemos la copia realizada borramos el fichero f1.txt en HDFS

hdfs dfs -rm /datos/f1.txt

Lo podemos recuperar desde el snapshot con:

Terminal window
hadoop fs -cp /datos/.snapshot/snap1/f1.txt /datos/
## -cp solo hace copias entre HDFS, para "sacar" el fichero de HDFS hay que utilizar -get
hdfs dfs -ls /datos
Terminal window
hdfs dfs -deleteSnapshot /datos snap1
Terminal window
hdfs dfsadmin -disallowSnapshot /datos

https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsSnapshots.html

En la misma máquina donde tenemos instalado hadoop:

  1. Creamos un entorno virtual.
  2. Instalamos los paquetes:
    • hdfs
    • pandas
  3. Ejecutamos el siguiente script.
import pandas as pd
from hdfs import InsecureClient
client = InsecureClient('http://localhost:9870')
with client.read('/productos.csv') as file:
df = pd.read_csv(file)
print(df.head())
print(df.info())
print(df.describe().transpose())
print(client.list('/'))
# Bajando un archivo de Hadoop a nuestro local
client.download('/productos.csv', './productos.csv')
# Bajando multiples archivos
#for file in client.list('/'):
# client.download(f'/{file}', './csv')
client.upload('/','test.py')
print(client.list('/'))
client.delete('/test.py')

ERROR1 Si accedemos a la url que indica la consola de desarrolladores vemos el error: http://localhost:9870/webhdfs/v1/?op=LISTSTATUS Este error se debe a que tenemos instalada la versión 17 de openjdk y hadoop es compatible hasta la versión 11. Para solucionarlo, debemos descargar en /opt la versión 11 de java e indicarle al sistema que la utilice: https://learn.microsoft.com/en-us/java/openjdk/download#openjdk-11

  1. La descargamos en /opt
  2. La descomprimimos y creamos un enlace a la misma llamado jdk11
  3. Actualizamos el gestor de versiones de ubuntu con la nueva versión de java (como root) y la seleccionamos:
    1. `update-alternatives —install /usr/bin/java java /opt/jdk11/bin/java 11’
    2. update-alternatives —config java
  4. Al ejecutar java -versionya tendremos la versión 11 por defecto en el sistema.
  5. Ahora debemos de:
    1. Detener dfs
    2. Actualizar el .bashrc del usuario hadoop con la nueva versión de Java
    3. Actualizar también la ruta de java en los ficheros de configuración de hadoop.
  6. Si hemos hecho todo lo necesario, ya no saldrá el error:

ERROR2 No aparece información del archivo Se trata de un archivo vacío.

ERROR3

Este error se debe a que no tenemos expuesto (abierto) el puerto 9864en nuestro contenedor.