Desplegar un clúster Hadoop con Docker Desktop para big data. Desplegaremos Hadoop en su versión 3.3.6 con Docker Desktop sobre un equipo Windows. El proceso es similar para Docker sobre Linux. Crearemos los NodeName, la red, el ResourceManager, los DataNodes y NodeManagers y probaremos tanto el HDFS como el clúster Hadoop ejecutando una aplicación MapReduce con YARN.

Qué es Hadoop, HDFS, YARN, MapReduce

Hadoop

Hadoop es un framework open source para aplicaciones distribuidas que trabajan con Big Data. Hadoop permite el procesamiento de enormes cantidades de datos en grandes clústeres de hardware barato (commodity clusters).

Hadoop tiene las siguientes características:

  • Escala: petabytes de datos en miles de nodos.
  • Bajo coste: clústeres baratos o en cloud.
  • Facilidad de uso.
  • Tolerancia a fallos.

Hadoop tiene la siguiente arquitectura:

  • Almacenamiento distribuido: HDFS (Hadoop Distributed File System).
  • Planificación de tareas y negociación de recursos: YARN (Yet Another Resource Negotiator).
  • Procesamiento distribuido: MapReduce (librería que permite crear o diseñar aplicaciones).
Qué es Hadoop

HDFS

HDFS, como hemos indicado anteriormente, es un sistema de ficheros, que presenta las siguientes ventajas:

  • Diseñado para almacenar ficheros muy grandes,.
  • Elevado ancho de banda.
  • Elevada fiabilidad gracias a la replicación (los ficheros se dividen en bloques que se replican en diferentes nodos del clúster).

HDFS presenta algunas desventajas:

  • Elevada latencia.
  • Poco eficiente cuando hay muchos ficheros pequeños.

HDFS utiliza varios demonios (servicios) para su funcionamiento:

  • NameNode: mantiene la información (metadatos) de los ficheros y los bloques en los que residen. No almacena la información en si. El concepto es similar a una tabla de asignación de ficheros (FAT).
  • DataNodes: mantiene los bloques de datos. Los DataNodes no saben dónde reside cada bloque de cada fichero, únicamente almacenan la información en si, el que sabe dónde está cada bloque es el NameNode.

El despliegue que se realizará en este artículo será el siguiente:

Qué es Hadoop

Teniendo en cuenta que se desplegará únicamente un NameNode y tres DataNodes.

Por defecto, HDFS creará bloques de 128MB de tamaño y cada bloque se replicará, al menos, tres veces (en tres nodos DataNodes diferentes). Estos y otros parámetros son configurables.

HDFS incluye algunos comandos para el manejo de ficheros:

ComandoAcción
hdfs dfs -ls <ruta>Lista ficheros
hdfs dfs -ls -R <ruta>Lista ficheros recursivamente
hdfs dfs -cp <origen> <destino>Copia ficheros de HDFS a HDFS
hdfs dfs -mv <origen> <destino>Mueve ficheros de HDFS a HDFS
hdfs dfs -rm <ruta>Borra ficheros en HDFS
hdfs dfs -rm -r <ruta>Borra ficheros recursivamente en HDFS
hdfs dfs -cat <ruta>Muestra el contenido del fichero
hdfs dfs -tail <ruta>Muestra el final del fichero
hdfs dfs -stat <ruta>Muestra estadísticas del fichero
hdfs dfs -mkdir <ruta>Crea directorio en HDFS
hdfs dfs -chmod <ruta>Cambia los permisos del fichero
hdfs dfs -chown <ruta>Cambia el propietario del fichero
hdfs dfs -put <local> <destino hdfs>Copia ficheros de local a HDFS
hdfs dfs -get <origen hdfs> <destino local>Copia de HDFS a local

YARN

YARN, como hemos indicado anteriormente, es el planificador de tareas y el negociador de recursos del clúster Hadoop.

Se encarga de la gestión de recursos y job-scheduling/monitorización, usando tres demonios:

  • ResourceManager (RM): planificador general. Arbitra los recursos entre las aplicaciones en el sistema. Es un demonio global y obtiene datos del estado del clúster, de todos los node managers.
  • NodeManagers (NM): monitorización de recursos del clúster, uno por nodo.
  • ApplicationMasters (AM): gestión de aplicaciones, uno por aplicación. Se encarga de gestionar el ciclo de vida de la aplicación. Solicita recursos (contenedores) al ResourceManager y ejecuta la aplicación en esos contenedores. Trabaja con los Nodemanagers para ejecutar y monitorizar las tareas.

Permite que diferentes tipos de aplicaciones (no solo MapReduce) se ejecuten en el clúster. Las aplicaciones se despliegan en “contenedores”, que son máquinas virtuales de Java (JVMs)

Qué es Hadoop

Programación MapReduce

Se trata de un modelo de programación data-parallel diseñado para la escalabilidad y la tolerancia a fallos en grandes sistemas de commodity hardware.

Algunas de sus características:

  • Está basado en la combinación de operaciones Map y Reduce.
  • Los datos de entrada se organizan como listas de pares clave/valor. Estos datos están distribuidos y replicados en HDFS.

La operación Map:

  • Aplica la misma función a diferentes bloques de entrada.
  • Operación totalmente paralela: las funciones map se ejecutan sobre los nodos del clúster Hadoop.
  • Cada función map lee los datos del nodo en el que se ejecuta.

La operación Reduce:

  • Realiza una operación de reducción sobre las salidas de los map.
  • Puede haber varios reduces.

Requisitos para montar un clúster Hadoop con Docker Desktop

Necesitaremos disponer de un equipo con Docker Desktop (sea en Windows o en Linux). En el siguiente artículo explicamos cómo desplegar Docker Desktop sobre un equipo Windows:

Y en este otro desplegamos Docker Desktop en Linux:

El equipo anfitrión con Docker Desktop debe tener conexión a Internet.

Por supuesto, en un despliegue de producción real, crearemos los nodos en equipos físicos diferentes con discos duros diferentes, para que el clúster tenga sentido, por si cae algún nodo, el resto seguirán prestando el servicio. En este artículo, a modo de ejemplo, montamos los nodos en un mismo equipo anfitrión, si el equipo cae, caerán todos los nodos.

Para el despliegue del clúster Hadoop sobre Docker, necesitaremos una serie de carpetas y ficheros de configuración, que podemos descargar desde:

Descargaremos el fichero anterior y lo descomprimiremos en una carpeta de nuestro equipo anfitrión con Docker Desktop. Este fichero descomprimido contendrá las siguientes carpetas y ficheros, necesarios para el despliegue:

Requisitos para montar un clúster Hadoop con Docker Desktop

Instalación base de Hadoop con Docker Desktop

Iniciaremos el despliegue del clúster construyendo una imagen Hadoop base (con Linux Ubuntu). Para ello, desde la línea de comandos, accederemos a la carpeta donde tengamos los ficheros de despliegue del clúster (que podéis descargar desde este enlace). Una vez en la carpeta de los ficheros de despliegue, accederemos a la carpeta Base:

Y ejecutaremos el siguiente comando:

Con el comando anterior, indicamos a Docker Desktop que use el fichero dockerfile de la carpeta actual.

Instalación base de Hadoop con Docker Desktop

Se iniciará, de forma automática, la descarga y despliegue de una imagen con el sistema operativo Linux Ubuntu:

Instalación base de Hadoop con Docker Desktop

Comprobaremos que la imagen se ha desplegado correctamente, ejecutando el comando:

Nos mostrará la imagen desplegada, con el nombre «hadoop-base-image»:

Instalación base de Hadoop con Docker Desktop

Crear imagen docker NodeName para HDFS

Crearemos una imagen base para el NodeName, que será el que mantenga la información (metadatos) de los ficheros y bloques que residen en el HDFS (como hemos indicado anteriormente).

Para crear el NodeName con Linux Ubuntu, accederemos a la carpeta NodeName de los ficheros de despliegue y ejecutaremos el comando:

Crear imagen para NodeName para HDFS

Crear red virtual en Docker para interconexión de nodos

Necesitaremos una red virtual en Docker para la interconexión de todos los nodos del clúster. Para crear la red, desde la línea de comandos, ejecutaremos el comando:

Crear red virtual en Docker para interconexión de nodos

Para mostrar la red creada, ejecutaremos el comando:

Crear red virtual en Docker para interconexión de nodos

Iniciar un contenedor NodeName para probar acceso web y acceso al shell de comandos

Para iniciar el contenedor NodeName, ejecutaremos el siguiente comando:

En el caso de Windows, puede que nos solicite acceso el cortafuegos al puerto 9870, de ser así, permitiremos el acceso.

Una vez iniciado el contenedor, podremos acceder al servicio web, abriendo un navegador en el equipo Windows anfitrión de Docker y accediendo a la URL:

http://localhost:9870

Nos mostrará todos los datos del nodo:

Iniciar un contenedor NodeName para probar acceso web y acceso al shell de comandos

También podremos acceder al propio shell de comandos del nodo, ejecutando desde la línea de comandos del anfitrión de Docker (equipo Windows), el comando:

Entraremos el el shell de Linux Ubuntu del nodo, desde aquí podremos ejecutar comandos para este nodo, por ejemplo, para mostrar la versión de HDFS, ejecutaremos el comando:

Para salir del shell del nodo Linux al shell de Windows (anfitrión), ejecutaremos el comando:

Iniciar un contenedor NodeName para probar acceso web y acceso al shell de comandos

Crear imagen para ResourceManager para YARN

Para crear el contenedor dokcer para el ResourceManager, accederemos a la carpeta ResourceManager y ejecutaremos el comando:

Crear imagen para ResourceManager

Ejecutando el siguiente comando nos listará los contenedores desplegados:

Crear imagen para ResourceManager

Para iniciar el contenedor ResourceManager creado anteriormente, ejecutaremos el comando:

Una vez iniciado, podremos acceder a su web de gestión, desde el navegador del equipo WIndows anfitrión, introduciendo la URL:

http://localhost:8088

Crear imagen para ResourceManager

Crear imagen para los DataNodes y NodeManagers

Crearemos la imagen para los DataNodes y los NodeManagers. Para ello, accederemos a la carpeta DataNode-NodeManager de los ficheros del despliegue, y ejecutaremos el comando:

Crear imagen para los DataNodes y NodeManagers

Como siempre, podremos comprobar que la imagen está creada correctamente con el comando:

Crear imagen para los DataNodes y NodeManagers

Iniciar los tres contenedores que serán los workers en base a la imagen creada anteriormente

Una vez creadas todas las imágenes (NodeName, ResourceManager y Datanodes/NodeManagers), iniciaremos tres contenedores que serán tres equipos virtuales correspondientes a los workers, con el nombre dnnm1, dnnm2 y dnnm3. Para ello, ejecutaremos los siguientes comandos:

Todos estos contenedores usarán la red creada anteriormente y usarán como imagen base dnnm-image, creada en el punto anterior.

Si accedemos ahora al servicio web del NodeName veremos que ya se han registrado los tres nodos:

También podremos verlo en el servicio web del ResourceManager:

Probando el HDFS

Probaremos el HDFS copiando algún fichero desde el equipo Linux contenedor al sistema HDFS del Hadoop. Para ello, accederemos al shell del NodeName, ejecutando el comando:

En el shell de Linux, creamos un fichero llamado fich250M con un tamaño de 250MB, ejecutando el comando:

Copiaremos el fichero creado al entorno HDFS, a la carpeta /user/hdadmin y lo eliminaremos del equipo Linux, con el comando:

Probando el HDFS

Desde la interfaz web del NodeName, accediendo a «Utilities» – «Browse the filesystem» y explorando la carpeta /user/hdadmin, podremos comprobar que el fichero ha sido subido al entorno HDFS y, además, replicado a los nodos que componen el clúster Hadoop correctamente:

Probando el HDFS

Pulsando en el fichero, podremos ver el número de bloques en los que se ha dividido el fichero y en qué nodo reside cada bloque:

Probando el HDFS

Probando todo el clúster Hadoop ejecutando una aplicación MapReduce con YARN

Por último, para hacer más pruebas del correcto funcionamiento del clúster Hadoop, ejecutaremos una aplicación de ejemplo MapReduce. Para ello, accederemos al shell del ResourceManager, ejecutando el siguiente comando en el terminal del equipo Windows anfitrión de Docker:

Desde la línea de comandos del Linux que contiene el ResourceManager, ejecutaremos los siguientes comandos para ejecutar una aplicación MR de ejemplo (aproxima el valor de pi):

Probando todo el clúster Hadoop ejecutando una aplicación MapReduce con YARN

Comprobaremos, en la interfaz web del ResourceManager que, efectivamente, el trabajo se ha ejecutado y ha finalizado correctamente. También doremos comprobar qué nodo del clúster la ejecutó, en nuestro caso en el dnnm1:

Probando todo el clúster Hadoop ejecutando una aplicación MapReduce con YARN

Y el número de contenedores MR que se ejecutaron (en nuestro caso 18):

Probando todo el clúster Hadoop ejecutando una aplicación MapReduce con YARN

Realizar el despliegue del clúster Hadoop sobre Docker de forma automática con Docker Compose

En la descarga de los ficheros del despliegue (disponible en este enlace), tendremos disponible el fichero docker-compose.yml, que será el que necesitemos para realizar el despliegue automático de toda la infraestructura anterior, teniendo en cuenta que sí necesitaremos tener creadas las imágenes base.

Si hemos seguido los pasos anteriores y tenemos iniciados los contenedores, antes de hacer el despliegue automático, los detendremos. Para ello, ejecutaremos estos comandos:

Para realizar el despliegue automático, con las imágnes base creadas (dnnm1, dnnm2, dnnm3, namenode y resourcemanager) abriremos un shell de comandos en el equipo Windows anfitrión y accederemos a la carpeta de la descarga de los ficheros del despliegue, donde tengamos el fichero docker-compose.yml. Ejecutaremos el siguiente comando para desplegar el clúster Hadoop con tres nodos:

Realizar el despliegue del clúster Hadoop sobre Docker de forma automática con Docker Compose

Para detener el clúster, ejecutaremos el comando:

Para iniciarlo, ejecutaremos:

Y si queremos eliminarlo, ejecutaremos:

Realizar el despliegue del clúster Hadoop sobre Docker de forma automática con Docker Compose