Introducción
En este tutorial, aprenderemos a crear una máquina virtual en Microsoft Azure y a configurar un clúster de Hadoop utilizando Docker. A través de una conexión SSH, instalaremos y configuraremos todos los componentes necesarios para levantar un clúster clásico de Hadoop, lo que nos permitirá ejecutar tareas de procesamiento de datos distribuidos en un entorno virtualizado. Este proceso será detallado paso a paso para garantizar que puedas replicarlo sin problemas.
1. Crear una Máquina Virtual en Azure
El primer paso consiste en crear una máquina virtual en el Portal de Azure. Sigue estos pasos:
- Inicia sesión en tu cuenta de Azure.
- En la barra de búsqueda ubicada en la parte superior del portal, escribe "Máquina Virtual" y selecciona la opción que aparece en los resultados.
- Haz clic en el botón "Crear" para iniciar el proceso de creación de la máquina virtual.
Datos Básicos:
- Creamos el Grupo de Recursos.
- Nombramos la máquina virtual.
- Seleccionamos la región. En este caso seleccione (Europe) France Central, porque es la región que permite crear la máquina con esa imagen y esos recursos.
- Tipo de seguridad "Estándar".
- Imagen: Ubuntu Minimal 20.04 LTS -x64 gen.2
- Tamaño: Standard D2s_v3 (2vCPU, 8 GiB)
- Autenticación: Clave pública SSH
- Nombre de Usuario: azureuser
- Tipo de clave SSH: Formato RSA SSH
- Puertos de entrada públicos: Solo los puestos seleccionados.
- Seleccionar el puerto de entrada SSH (22)
Discos:
- Tamaño del disco del SO: Valor predeterminado de la imagen (30GiB)
- Tipo de disco: HDD estándar (almacenamiento con redundancia local)
- Eliminar con VM: Habilitado
- La clave administrada por la plataforma.
- Compatibilidad con Ultra Disks deshabilitado.
Redes:
- Red virtual, Subred y la IP pública dejamos la que se crea por defecto.
- En grupo de seguridad de red de NIC marcamos Básico.
- Permitimos los puestos seleccionados y marcamos únicamente SSH (22).
- Habilitamos la Eliminación de IP pública y NIC cuando se elimine la VM y deshabilitamos las redes aceleradas.
- En este caso no necesitaremos el Load Balancer así que en Opciones de equilibrio de carga marcamos: Ninguno.
Administración:
- Identidad y Microsoft Entra ID: Deshabilitado
- Habilitamos el apagado automático y notificamos guardando un correo electrónico.
- Deshabilitamos la copia de seguridad para este ejemplo.
- En la parte de Actualizaciones de SO invitado, dejamos como Valor predeterminado de la imagen en la sección de Opciones de orquestación de revisores.
Supervisión:
Dejamos configurado de las siguiente manera:
Opciones avanzadas:
Dejamos todo por defecto, deberá quedarte así:
Revisar y Crear:
Cuando terminemos con las configuraciones da clic en "Revisar y Crear", en esta sección se despliega toda la información de configuración de la máquina virtual, asegúrate que todo este correctamente configurado y da clic en "Crear".
Azure no guarda las claves privadas, así que, de dirá que descargues la clave SSH para que te puedas conectar después de la instalación, da clic en "Descargar la clave privada y crear el recurso".
Ahora ya tendrás instalado tu máquina virtual en el Portal de Azure.
2. Conexión por SSH desde local a VM de Azure
Ahora que hemos creado nuestra máquina virtual en Azure, el siguiente paso es establecer una conexión SSH desde nuestro equipo local hacia la VM. Este proceso nos permitirá acceder al sistema operativo de la máquina virtual y realizar la configuración necesaria para levantar el clúster de Hadoop. A continuación, detallaremos cómo generar las claves SSH y conectarnos de forma segura.
- Abrimos nuestra terminal en la máquina local, navegaremos hacia donde hemos ubicado el archivo que se descargo la clave privada SSH y ejecutamos el siguiente comando:
ssh -i <ruta_de_la_clave> azureuser@<ip_de_tu_vm>
En mi caso he guardado la clave privada en una carpeta llamada Azure, puedes usar el nombre que quieras, también usare la terminal de WSL.
Para ver la dirección IP Pública, ve al portal de Azure en tu recurso de Máquina Virtual que haz creado, en Información General > Información Esencial: Tendrás la dirección ip pública.
Ejecutamos el comando con nuestros datos, si aparece el mensaje de Permissions 0777, como se ve en la imagen.
Cambiaremos los permisos para el archivo con:
sudo chmod 600 <ruta_de_la_clave>
Nota: Intente seguir el tutorial desde la WSL pero no me daba error de WARNING: UNPROTECTED PRIVATE KEY FILE! para solucionar solo me cambie a la terminal de PowerShell y ejecute el comando anterior y ahora funciona correctamente.
3. Configurar las reglas de seguridad en Azure:
A continuación, vamos a configurar las reglas de seguridad en Azure para permitir el acceso a los puertos necesarios para que Hadoop y YARN funcionen correctamente. En particular, necesitamos abrir los siguientes puertos:
- Hadoop (50070): Para acceder a la interfaz web de Hadoop.
- YARN (8088): Para acceder a la interfaz web de YARN.
Esto garantizará que podamos interactuar con ambos servicios a través de la red. Ahora, procederemos a modificar las reglas del grupo de seguridad de red para habilitar el acceso a estos puertos.
- Desde la interfaz de usuario de Azure: Accede al grupo de seguridad de red (NSG):
- En el portal de Azure, ve a tu Máquina Virtual y selecciona la opción Redes en el menú de la izquierda.
- Busca el Network Security Group (NSG) asociado a la interfaz de red de tu VM (probablemente tenga el nombre Hadoop-1-nsg o algo similar).
- Haz clic en el nombre del NSG para abrirlo.
Agregar reglas de entrada:
Dentro del NSG, ve a la sección Inbound security rules (Reglas de seguridad de entrada).
Haz clic en "Agregar" para agregar una nueva regla.
Configurar los puertos necesarios:
Puerto SSH (22) - Ya debería estar configurado
Web UI de Hadoop (50070):
- Destination port ranges: 50070
- Protocol: TCP
- Action: Allow
- Priority: 110
- Name: Hadoop-NameNode-UI
YARN ResourceManager (8088)
- Destination port ranges: 8088
- Protocol: TCP
- Action: Allow
- Priority: 120
- Name: YARN-ResourceManager
Después de ingresar los datos para cada regla, haz clic en "Agregar" para guardarla.
Verificación:
Una vez que hayas agregado todas las reglas, verifica que aparecen en la lista de Inbound security rules y que están configuradas correctamente.
4. Levantando el Clúster de Hadoop
En este paso, procederemos a levantar un clúster de Hadoop en nuestra máquina virtual. Utilizaremos un proyecto que previamente realizamos en clase, el cual, para este ejemplo, será un contador de palabras. Este proyecto nos permitirá poner en práctica la funcionalidad básica de Hadoop, ejecutando un proceso de mapeo y reducción sobre un conjunto de datos. A continuación, detallaremos los pasos para configurar y ejecutar el clúster de Hadoop.
Instalación Docker en VM:
Actualizamos la lista de paquetes existentes:
sudo apt update
A continuación: instale algunos paquetes de requisitos que permitan apt usar paquetes a través de HTTPS:
sudo apt install apt-transport-https ca-certificates curl software-properties-common
Luego, añada la clave de GPG para el repositorio oficial de Docker en su sistema:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
Agregue el repositorio de Docker a las fuentes de APT:
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
A continuación, actualice el paquete de base de datos con los paquetes de Docker del repositorio recién agregado:
sudo apt update
Asegúrese de estar a punto de realizar la instalación desde el repositorio de Docker en lugar del repositorio predeterminado de Ubuntu:
apt-cache policy docker-ce
Si bien el número de versión de Docker puede ser distinto, verás un resultado como el siguiente:
docker-ce: Installed: (none) Candidate: 5:19.03.9~3-0~ubuntu-focal Version table: 5:19.03.9~3-0~ubuntu-focal 500 500 https://download.docker.com/linux/ubuntu focal/stable amd64 Packages
Observe que docker-ce no está instalado, pero la opción más viable para la instalación es del repositorio de Docker para Ubuntu 20.04 ( focal).
Por último, instale Docker:
sudo apt install docker-ce
Con esto, Docker quedará instalado, el demonio se iniciará y el proceso se habilitará para ejecutarse en el inicio. Compruebe que funciona:
sudo systemctl status docker
El resultado debe ser similar al siguiente, y mostrar que el servicio está activo y en ejecución:
Output ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-05-19 17:00:41 UTC; 17s ago TriggeredBy: ● docker.socket Docs: https://docs.docker.com Main PID: 24321 (dockerd) Tasks: 8 Memory: 46.4M CGroup: /system.slice/docker.service └─24321 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
La instalación de Docker no solo proporcionará el servicio de Docker (el demonio), sino también la utilidad de línea de comandos docker, que es el cliente para interactuar con Docker. Más adelante, en este tutorial, exploraremos cómo utilizar el comando docker para gestionar contenedores y ejecutar aplicaciones.
Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multi-contenedor. Con Compose, usas un archivo YAML para configurar los servicios de tu aplicación y luego con un solo comando puedes crear y empezar todos los servicios.
Primero, descarga la última versión estable de Docker Compose desde su repositorio oficial. En la terminal ejecuta el siguiente comando:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.0.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Luego da permisos de ejecución al docker-compose
sudo chmod +x /usr/local/bin/docker-compose
Ahora si das un:
docker-compose --version
Podrás ver que se instalo correctamente.
Si no se instala correctamente puede ser problema de la ruta intenta instalar con wget:
sudo wget https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m) -O /usr/local/bin/docker-compose
Creación del Proyecto:
- Clonamos el proyecto de ejemplo:
git clone https://github.com/leo-narvaez/hadoop-docker-cluster cd hadoop-docker-cluster
- Construimos y levantamos el proyecto con:
docker-compose up -d
Comenzará con la instalación:
Nota: En mi terminal, ejecuté el comando consudo
(sudo docker-compose up -d
) porque no agregué mi usuario al grupodocker
durante la instalación, lo cual es necesario para ejecutar los comandos de Docker y Docker Compose sinsudo
. Este paso se puede agregar en los pasos de instalación. Para este ejemplo, opté por no hacerlo, pero se recomienda configurarlo para facilitar el uso de Docker sin necesidad de privilegios de superusuario.
Veremos el estado del contenedor:
docker ps
Ejecución del Contador de Palabras con MapReduce
Ahora que tenemos el contenedor de Docker en ejecución, el siguiente paso será realizar el conteo de palabras utilizando el modelo MapReduce. Este es el proceso que usaremos para distribuir el trabajo de procesamiento de datos de manera eficiente en Hadoop, aprovechando las capacidades de mapeo y reducción para contar las palabras en un conjunto de datos.
A continuación, explicaremos cómo preparar y ejecutar el proyecto de conteo de palabras utilizando MapReduce en nuestro clúster de Hadoop.
Creamos un archivo de prueba:
echo "Este es un ejemplo de texto largo que vamos a usar para probar la funcionalidad de Word Count en Hadoop." > test.txt
Copiar el Archivo al Contenedor
docker cp test.txt namenode:/tmp/
Subir el Archivo a HDFS
docker exec -it namenode hdfs dfs -put /tmp/test.txt /
Ejecutar el Comando de Word Count
docker exec -it namenode yarn jar /opt/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.3.5.jar wordcount /test.txt /output
Ver los Resultados:
docker exec -it namenode hdfs dfs -cat /output/part-r-00000
Cuando termines de trabajar, puedes detener el clúster con:
docker-compose down
Importante: Dado que esta es una práctica de laboratorio, es crucial recordar que los recursos creados en Azure (como la máquina virtual, el clúster de Hadoop y otros servicios) consumen recursos y pueden generar costos adicionales si se mantienen activos. No olvides eliminar todos los recursos una vez finalizada la práctica para evitar cargos innecesarios. Puedes hacerlo desde el Portal de Azure, eliminando la máquina virtual y cualquier otro recurso asociado, como grupos de recursos, discos o direcciones IP públicas.
Conclusión
En esta práctica, hemos aprendido a configurar un entorno de Docker en Azure, levantar una máquina virtual, y desplegar un clúster de Hadoop para realizar el procesamiento de datos utilizando el paradigma MapReduce. A través de este ejercicio, pudimos ver cómo Hadoop facilita el procesamiento distribuido de grandes volúmenes de datos y cómo Docker simplifica la implementación y gestión de contenedores, asegurando un entorno consistente para ejecutar nuestras aplicaciones.
El uso de Docker junto con Hadoop en la nube (en este caso, Azure) no solo mejora la escalabilidad y flexibilidad, sino que también nos permite experimentar con tecnologías clave para la gestión de grandes datos de una manera más eficiente. Además, al aplicar MapReduce para tareas como el conteo de palabras, hemos comprobado cómo se pueden distribuir tareas complejas entre múltiples nodos, optimizando el tiempo de ejecución y el uso de recursos.
Esta práctica nos brinda una comprensión más profunda de cómo integrar diferentes tecnologías (Docker, Hadoop, y Azure) para la gestión y procesamiento de datos a gran escala, lo que resulta ser un paso fundamental para adentrarnos en el mundo de la ingeniería de datos y el análisis de Big Data.