-
Instalar Docker para Windows, MacOs o Linux (ver distribución desplegando la opción Linux en el panel de la izquierda).
- (Solo Linux) Instalar docker-compose. En Windows y MacOs viene cuando se instala Docker.
-
Hacer un clone de este repositorio con
git clone https://github.com/midusi/bigdata-docker.git
-
Abrir el archivo docker-compose.yml y editar donde dice <ruta> definiendo la carpeta donde se van a manejar todos los archivos locales que queremos que sean accesibles desde el contenedor. Ej. /home/Facultad/Big_data/Practicas:/home/big_data/practica. Ahora todos los archivos de /home/Facultad/Big_data/Practicas del host se encuentran en el contenedor dentro de la ruta /home/big_data/practica. Nota importante: no hace falta hacer un restart del contenedor cuando los archivos en el host son editador, los cambios se representan en tiempo real en el contenedor de manera bilateral.
Considérese el contenedor como una máquina virtual sin interfaz gráfica donde se dejan todas las herramientas utilizadas durante la cursada. Cuando se cierra la consola donde corre el contenedor o se ejecuta el comando exit
en el mismo este se cierra y hay que volver a levantarlo, el equivalente a cerrar la ventana del virtualbox donde corre la virtual o apagar la misma respectivamente. Hay otras diferencias que son muy importantes:
-
Todos los puertos del contenedor se mapean al host, es decir, que si en el contenedor levantamos Hadoop y este abre un servicio web en el puerto 9870, se debería poder abrir un navegador en el host y acceder a
localhost:9870
sin problemas. -
Nada de lo que NO esté mapeado en
docker-compose.yml
en la secciónvolumes
se persiste: todo lo que se cree en el contenedor una vez que este se baja se pierde, esto es una ventaja cuando se rompe la configuración o alguna dependencia, de esta manera el contenedor siempre se puede volver al estado funcional inicial. Lo que se mapee en la secciónvolumes
será lo único que quedará guardado aún cuando el contenedor sea detenido. En nuestro caso definimos dos volumes:- hdfs-data:/tmp/hadoop-root es la carpeta donde Hadoop guarda los archivos del filesystem distribuido cuando hacemos uso del comando
hdfs dfs ...
. De esta manera no perdemos los resultados de los scripts que utilicen ese filesystem. Esta línea no debería ser cambiada. - <ruta>:/home/big_data/practica para poder escribir scripts con nuestras propias herramientas en el host en la ruta <ruta> y que dichos archivos sean accesibles en el directorio /home/big_data/practica para utilizarlos con Hadoop, Spark, HDFS, y el resto del software instalado en el contenedor. Esta línea debería ser cambiada para mapear el directorio en el host de preferencia.
- hdfs-data:/tmp/hadoop-root es la carpeta donde Hadoop guarda los archivos del filesystem distribuido cuando hacemos uso del comando
En la misma carpeta donde se encuentra el archivo docker-compose.yml ejecutar:
docker-compose run --rm --name big_data bigdata
Ahí mismo se abrirá una consola bash dentro del contenedor con todas las herramientas instaladas. Para salir del contenedor basta con ejecutar exit
en dicha consola bash.
Si se quiere entrar al mismo contenedor por diferentes consolas se puede hacer a través de:
docker container exec -it big_data bash
Eso abrirá una consola en el contenedor que está corriendo. Se pueden abrir cuantas consolas se quiera en un mismo contenedor. Todas las conexiones se cerrarán cuando se baje el contenedor.
Para levantar los servicios de Hadoop se debe hacer uso del script hadoopAction.sh ubicado en la carpeta principal /home/big_data.
Ejecutar cada vez que se levanta el contenedor ./hadoopAction.sh start
Cuando se deje de usar ejecutar ./hadoopAction.sh stop
para bajar los servicios de manera segura.
Hay scripts genéricos y con ejemplos de compilación tanto para Java como para Python utilizando Hadoop en la carpeta scripts de este repositorio.
Se deja a disposición una serie de ejemplos en el directorio principal del contenedor (/home/big_data/ejemplos
) con código de diferentes usos de librerías de Spark como Mlib, GraphX, entre otros.
Mlib se puede ejecutar con:
spark-submit <script de python>
Para GraphX hay que ejecutar spark-shell
de la siguiente manera:
spark-shell -i <script de scala>
Si se quiere editar dichos ejemplos se recomienda copiar los scripts en el directorio mapeado (el mapeo se hizo desde el docker-compose.yml
en la sección de instalación) para que los cambios no se pierdan cuando se baje el contenedor.
En el nodo Master:
- Correr
start-master.sh --host <IP del nodo master>
En los nodos Workers:
- Correr
start-slave.sh spark://<IP del nodo master>:7077
Se pueden ver los workers agregados en <IP del nodo master>:8081 (en la PC que lo hostea se puede acceder a través del localhost:8080).
Los workers pueden ver su panel en el localhost:8081.
Para correr una consola de pyspark en dicho cluster se debe ejecutar
pyspark --master spark://<IP del nodo master>:7077
De esta manera el proceso de pyspark correrá en el cluster establecido y no de manera local.
El proceso es el mismo para spark-submit:
spark-submit --master spark://<IP del nodo master>:7077
-
Debido a que la versión de Hadoop es diferente, el puerto para acceder al manager del master cambió de 50070 a 9870.
-
Compilación Java!!!: ya no tenés que preocuparte por correr todos los comandos de compilación para Java. Se deja a disposición un script global llamado
compilarJava.sh
. Para usarlo seguir los siguientes pasos:-
Posicionarse en la carpeta del proyecto a compilar.
-
El código fuente debe estar en una carpeta
src
. Y debe existir una carpetabin
a la misma altura. -
El script recibe los sig. parámetros: nombre del proyecto, package y clase pricipal (en el formato <package.clase>) y los parámetros propios del script. Ejemplo de Wordcount:
compilarJava.sh \ ejemplo_wordcount \ wordcount.Main \ file:///..../Libros/pg13507.txt \ resultado_ejemplo
-
-
Los scripts deben estar en python3
-
La cabecera debe ser cambiada de
#!/usr/bin/env python
a#!/usr/bin/python3
-
El script ahora se simplificó para las nuevas rutas de los ejecutables. Ver nuevo script de ejecución en ejecutarHadoopStreamingPython.sh (disponible ejemplo en el archivo ejecutarHadoopStreamingPython-ejemplo.sh)
-
Al igual que con Hadoop, se deja un script global que simplifica la ejecucion llamado
ejecutarHadoopStreamingPython.sh
que recibe 4 parámetros: source, dest, mapper y reducer. Ejemplo de Wordcount:ejecutarHadoopStreamingPython.sh \ file:///..../Libros/pg13507.txt \ resultados_python_streaming \ /home/big_data/practica/WordCount/Python/mapper.py \ /home/big_data/practica/WordCount/Python/reducer.py
- Para abrir una conexión con netcat en vez de utilizar
nc -lk 7777
utilizarcrearConexionStreaming.sh [<puerto>]
(el puerto es opcional, si no se especifica se usa por defecto el 7777). En caso de que quiera crear la conexión manualmente se puede corrernc -lk -p 7777 127.0.0.1
.
A continuación se listan los problemas más comunes y sus soluciones:
Solving Docker permission denied while trying to connect to the Docker daemon socket
Se debe agregar el usuario actual al grupo "docker" del sistema como lo indica la documentación post-instalación:
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
Correr docker info
y verificar que no arroja el error.
WARNING: Error loading config file: /home/user/.docker/config.json -stat /home/user/.docker/config.json: permission denied
Como se indica en la documentación post-instalación referenciada arriba, para solucionar este problema correr:
rm -rf ~/.docker/
sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
sudo chmod g+rwx "$HOME/.docker" -R
Al querer levantar el contenedor arroja en pantalla:
Cannot create container for service bigdata: Conflict. The container name "<algun nombre>" is already in use
Este problema ocurre porque quedó levantado el contenedor. Basta con pararlo para que el comando funcione:
docker container rm -f big_data
En el caso de que se agreguen cambios a la imagen, se puede actualizar la misma ejecutando en una consola:
docker image pull genarocamele/bigdata:latest