Las aplicaciones basadas en tecnologías Big Data generalmente funcionan de modo distribuido sobre plataformas empresariales que pueden alcanzar en algunos casos miles de máquinas de procesamiento. A la hora de practicar con estas aplicaciones, montar un entorno como el anterior no siempre es viable debido a la disponibilidad de recursos necesarios. Como alternativa, podemos utilizar contenedores ligeros y aplicaciones de orquestación de servicios para replicar las mismas arquitecturas de aplicaciones Big Data que podemos encontrar en un entorno productivo.

En este artículo veremos el modo en que aplicaciones tales como como Hadoop, Hive, Sqoop, Flume y Jupyter Notebook han sido configuradas para funcionar dentro de contenedores y desplegadas para su ejecución mediante el orquestador de servicios Kubernetes. Por otro lado, la funcionalidad de cada una de ellas podrá probarse mediante una serie de ejercicios prácticos diseñados con Jupyter Notebook.

Básicamente, un contenedor representa el empaquetado de una aplicación junto con todas las dependencias que necesita para su correcta ejecución. Es una especie de caja negra que contiene una aplicación totalmente funcional, pero sin tener en cuenta aspectos del sistema operativo donde vaya a ejecutarse.

Crear un contenedor es relativamente fácil utilizando una herramienta como Docker, que permite modelar el contenedor mediante una serie de sencillas órdenes a modo de manifiesto. Para nuestro caso, hemos creado dos contenedores principales, uno que incluye la funcionalidad de Apache Hadoop y otro que contendrá la funcionalidad de Hive y Jupyter Notebook. Los detalles de la implementación están al final del artículo.

Una vez tenemos los contenedores, la idea es que interactúen entre ellos, y aquí es donde entra en juego el orquestador de servicios Kubernetes, que es el que utilizaremos para realizar los despliegues.

Un orquestador administra los contenedores que se le proporcione manteniéndolos en un estado activo y permitiendo la interacción entre estos. El orquestador se encarga de distribuir los contenedores de un modo equilibrado sobre el número de máquinas físicas o virtuales que tenga configuradas, haciendo un uso más eficiente de los recursos de las mismas. Además, es posible replicar un mismo contenedor sobre distintas máquinas, de modo que si una falla el servicio sigue disponible en las otras sin pérdida del mismo. Una ventaja de utilizar Kubernetes es que es compatible con las principales plataformas de servicios en la nube como Google Cloud Platform (GCP) o AWS, lo que nos permite utilizar nuestros contenedores tanto en un entorno local como en la nube. En nuestro caso probaremos los despliegues sobre GCP.

La configuración del despliegue se realiza mediante una serie de ficheros de configuración que declaran el modo en que los contenedores han de ser desplegados. Por ejemplo, para el caso de Hadoop queremos que el contenedor que hemos creado pueda funcionar tanto como namenode como datanode, pudiendo además replicar el número de datanodes que estarán operativos. Los detalles de la implementación están también al final del artículo.

Finalmente, quedaría probar nuestros despliegues mediante una serie de ejercicios que son ejecutados desde Jupyter Notebook. Estos ejercicios sirven para probar que las plataformas son totalmente funcionales y también para el aprendizaje de las mismas. Los ejercicios hacen referencia a distintas funcionalidades de Hadoop como HDFS, el paradigma MapReduce con Hadoop Streaming y MRJob y su interacción con Apache Hive.

Todo el material necesario para ver las plataformas comentadas en acción puede ser descargado a través de este enlace.

Para descomprimir el archivo la clave es hadoop

Veamos ahora con más detalle cómo realizar los despliegues

Instalación en local

Para el correcto despliegue de las plataformas en un entorno local como puede ser un PC es necesario tener instalado un software que incluya una versión de Kubernetes como por ejemplo Minikube. Es un software de uso gratuito y compatible con Linux, Windows y MacOS. Los detalles de su instalación pueden encontrarse en su página web: https://kubernetes.io/es/docs/tasks/tools/install-minikube/.

Creación de la máquina virtual de  Minikube en local

Una vez instalado Minikube, es preciso crear la máquina virtual (MV) donde se alojarán las plataformas. La interacción con la MV se realiza a través del cliente kubeclt que se instala junto con Kubernetes. Los requisitos mínimos que debería tener la MV son 4GB de RAM y 2 CPUs. Desde la consola de comandos:

minikube –memory 4096 –cpus 2 start

Al cabo de unos minutos habrá creado la MV que se encontrará operativa para su uso:

Detalle de la creación de la máquina virtual de Kubernetes en Windows 10

Los siguientes comandos interactúan con la MV:

minikube stopDetiene la MV
minikube startArranca de nuevo la MV
minikube deleteElimina la MV

Instalación de las plataformas en local

Ya con la MV operativa nos situamos en el directorio del código hadoop-hive y lanzamos los comandos para insertar las claves RSA en kubernetes:

kubectl create secret generic name-node-secret  –from-file=ssh-privatekey=.\Dockerfiles\secrets\id_rsa –from-file=ssh-publickey=.\Dockerfiles\secrets\id_rsa.pub
kubectl create secret generic data-node-secret  –from-file=ssh-publickey=.\Dockerfiles\secrets\id_rsa.pub

Minikube nos informa de que los objetos han sido creados:

Creación de objetos secret en Kubernetes

Desde el mismo directorio, desplegamos las plataformas con el comando apply:

kubectl apply -f .\yaml\

Minikube nos informa de que los objetos han sido creados:

La primera vez que se despliegan las plataformas tienen que descargar las imágenes desde DockerHub y es normal que el despliegue se prolongue unos minutos. En sucesivos despliegues este paso ya no es necesario y solo toma unos segundos.

Para monitorizar el despliegue se puede utilizar desde consola el comando:

kubectl get pods

Monitorizaremos la creación de los pods hasta que su status sea running.

Otra opción es abrir la WebUI de kubernetes lanzando desde consola:

minikube dashboard

En este caso, esperamos a que el panel de pods los muestre todos operativos

Una vez con todos los pods operativos, abrimos las WebUI de YAML, HDFS y Jupyter Notebook lanzando desde consola los siguientes comandos:

minikube service hdfs-service
minikube service yarn-service
minikube service jupyter-hadoop

En unos instantes se abrirá cada WebUI en el navegador, Si alguna de ellas da error es porque el clúster puede estar todavía inicializando. Actualizar con F5 hasta que salgan las pantallas principales.

Detalle de las WebUI de HDFS, YARN y Juputer Notebook

Principalmente se utilizará la de Jupyter Notebook para trabajar con los ejercicios.

Ejecución de ejercicios

Para cargar los ejercicios que se encuentran en la carpeta Notebooks del contenido descargado seguiremos los siguientes pasos:

  1. Situarse en la WebUI de Jupyter Notebook.
  2. Pulsar el botón upload situado en la parte superior derecha.
  3. Desde la ventana emergente que aparece buscar el archivo a subir.
  4. Una vez seleccionado pulsar el botón abrir de la ventana emergente.
  5. Desde la WebUI de Jupyter Notebook pulsar el botón upload asociado al archivo.

Con lo anterior ya tendríamos subido el archivo a la plataforma

Detalle del archivo subido a la plataforma de Jupyter Notebook

Si pulsamos sobre el mismo, veremos su contenido en Jupyter Notebooks.

Detalle del contenido de un ejercicio una vez abierto con Jupyter Hadoop

Con el botón Run que se encuentra en el menú superior de la WebUI iremos ejecutando el contenido de cada celda del ejercicio.

Detalle del resultado de una orden ejecutada desde Jupyter Notebook

Cierre de las plataformas en local

Para cerrar las plataformas en Minikube, situados en el directorio hadoop-hive lanzar desde la consola de comandos:

kubectl delete -f .\yaml\

Minikube nos informa de que los objetos han sido borrados:

Instalación en la nube

Las principales plataformas que ofrecen servicios de computación en la nube como AWS, Azure y GCP son compatibles con Kubernetes, por lo que el despliegue de nuestras plataformas se podría realizar en cualquiera de ellas. Veamos los pasos para su instalación en GPC (Google Cloud Platform).

Para operar con GCP es preciso tener creada una cuenta, todos los detalles pueden encontrarse en su página web https://cloud.google.com/

Creación del clúster de máquinas en GCP

Una vez iniciada sesión y en la pantalla principal de GCP:

  1. Pulsar sobre el menú superior izquierdo.
  2. Seleccionar el servicio Kubernetes Engine.
  3. Pulsar Crear clúster en el cuadro central que aparece.

Pasos para la creación de un clúster en GCP

Tras estos pasos se mostrará  una nueva pantalla para la configuración del clúster. Con los valores predeterminados que muestra es suficiente para el despliegue de las plataformas, pero si se desea pueden explorarse las opciones de configuración que aparecen en el menú de la izquierda.

Una vez se tenga la configuración pulsar el botón crear que aparece en la parte inferior. Aparecerá una nueva pantalla indicando la creación del clúster, tarda unos minutos en crear los recursos.

Creación de los recursos del clúster en GCP

Cuando el clúster haya sido creado pulsar el botón conectar para acceder al mismo.

En la ventana emergente que aparece, seleccionar Ejecutar en Cloud Shell

Conexión a Cloud Shell

Cloud Shell es una consola de comandos que conecta al clúster creado mediante el navegador web. Cuando se inicia, tiene la orden de conexión al clúster preparada, pulsar intro para acceder. Por defecto la Shell aparece en la parte inferior de la pantalla, pero puede llevarse a una ventana independiente pulsando la opción de Abrir en una ventana nueva.

Detalle de la consola de Cloud Shell

Instalación de las plataformas en GCP

Ahora subiremos el archivo hadoop-hive.tar.gz  al clúster.

  1. Pulsar sobre el icono más
  2. En el menú desplegable seleccionar Subir archivo.

Tras la subida, el archivo estará en la consola. Sólo hay que descomprimir el paquete y acceder al directorio hadoop-hive. Los siguientes comandos realizan estos pasos:

tar -xvf hadoop-hive.tar.gz
cd hadoop-hive

Ya solo queda  desplegar, los pasos son los mismos que los vistos en local: creación de claves RSA y despliegue de plataformas.

kubectl create secret generic name-node-secret  –from-file=ssh-privatekey=./Dockerfiles/secrets/id_rsa –from-file=ssh-publickey=./Dockerfiles/secrets/id_rsa.pub
kubectl create secret generic data-node-secret  –from-file=ssh-publickey=./Dockerfiles/secrets/id_rsa.pub
kubectl apply -f ./yaml/

La creación de las plataformas se puede monitorizar desde WebUI de GCP, en la sección cargas de trabajo. El botón actualizar refresca el estado de los elementos.

Plataformas desplegadas en el clúster de GCP

Cuando todas las plataformas hayan sido creadas, pulsaremos en el menú de la izquierda la opción Services e Ingress para ir en busca de las direcciones IP públicas que se han asignado a los servicios de HDFS, YARN y Jupyter Notebook.

En la columna puntos de conexión se encuentran las IPs públicas que GCP ha provisionado para nuestros servicios, pulsando sobre cada una de ellas nos llevará a la WebUI  correspondiente tal y como ocurría en el despliegue en local.

Los pasos para subir y ejecutar los ejercicios son los mismos que hemos utilizado para el despliegue en local.

Cierre de las plataformas en GCP

Para cerrar las plataformas en GCP lo más rápido es hacerlo desde Cloud Shell, situados en el directorio hadoop-hive lanzar desde esta consola de comandos:

kubectl delete -f ./yaml/

Como hemos visto, los pasos para realizar la instalación son muy sencillos tanto en local como en la nube y en unos minutos se tienen funcionando las plataformas comentadas.

Espero que os sea de utilidad para el aprendizaje de estas tecnologías. Además UNED presenta una serie de propuestas formativas que te pueden ser de interés, detalladas abajo…

¡Te esperamos!

Contenido correspondiente al Proyecto de Fin de Grado: Diseño y despliegue de infraestructuras Big Data basadas en tecnologías de virtualización ligera y cloud computing

Realizado por Antonio García Hernández, Graduado en Ingeniería en Tecnologías de la Información.

Dirigido por Agustín C. Caminero Herráez, Profesor Titular del Depto. de Sistemas de Comunicación y Control de la ETSI Informática de la UNED.

Si deseas aprender las tecnologías que se mencionan en este post, UNED oferta las siguientes propuestas:

  • Curso “Despliegue de aplicaciones basadas en microservicios con Docker,  Kubernetes y Helm”: 750 horas de duración. Estamos trabajando para que los/as estudiantes que completen este curso puedan solicitar créditos en los grados oficiales de la Escuela de Informática de la UNED.  https://formacionpermanente.uned.es/tp_actividad/idactividad/12016
Anuncio publicitario