Demo de Apache Spark para la materia 72.40 - Ingenieria del Software II del ITBA. Contiene diversos ejemplos para mostrar el potencial de cómputo distribuido de Spark.
Para esta prueba, se buscará implementar de manera distribuida un word counter para el guión de una película. En este caso será necesaria la utilización de Docker, y se utilizara
Para la configuración del nodo master, moverse a la carpeta de spark y levantar el proceso.
cd <directorio_spark>/sbin
./start-master.sh -h 0.0.0.0
Una vez levantada la instancia de Master, el resto de los nodos Workers pueden conectarse
Para ver los workers conectados se sugiere revisar http://localhost:8080/
Cuando todos los nodos workers se hayan conectado dirigirse a la carpeta /bin y levantar una consola de Scala
cd ./../bin
./spark-shell --master spark://<IP propia>:7077
Una vez en la consola proceder a realizar el word count en Scala
val textFile = sc.textFile("/tmp/texts/HarryPotter.txt")
val counts = textFile.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_ + _)
counts.collect()
Resulta necesario que el nodo master tenga el archivo a procesar en el path /tmp/texts/HarryPotter.txt
Para la configuración de los nodos workers, moverse a la carpeta de spark y levantar el proceso
cd <directorio_spark>/sbin
./start-worker.sh spark://<IP master>:7077
Para ver el estado de los trabajos asociados,se sugiere revisar http://localhost:8081/
Resulta necesario que todos los nodos workers tengan el archivo a procesar en el path /tmp/texts/HarryPotter.txt
En esta prueba se intentará estimar el valor de PI mediante el Método de Monte Carlo, distribuyendo los puntos a procesar entre todos los nodos.
Para la configuración del nodo master, moverse a la carpeta de spark y levantar el proceso.
cd <directorio_spark>/sbin
./start-master.sh -h 0.0.0.0
Una vez levantada la instancia de Master, el resto de los nodos Workers pueden conectarse
Para ver los workers conectados se sugiere revisar http://localhost:8080/
Cuando todos los nodos workers se hayan conectado dirigirse a la carpeta /bin y levantar una consola de Scala
cd ./../bin
./spark-shell --master spark://<IP propia>:7077
Una vez en la consola proceder a realizar el cálculo de PI en scala
val NUM_SAMPLES=100000000
val count = sc.parallelize(1 to NUM_SAMPLES).filter { _ =>
val x = math.random
val y = math.random
x*x + y*y < 1
}.count()
println(s"Pi es casi ${4.0 * count / NUM_SAMPLES}")
En este caso, vamos a hacer el procedimiento con docker. En primer lugar descargamos la imagen
docker pull spark
Luego, creamos el contenedor
docker run -it --rm -p 8081:8081 spark bash
Adentro del contenedor, nos registramos con el nodo master
cd ..
./sbin/start-worker.sh spark://<ip_master>:7077
Cuando se ejecuta un nuevo trabajo distribuido en el cluster, Spark ofrece una interfaz que permite monitorear el estado de la ejecución y analizar métricas de performance. Sin embargo, cuando este trabaja finaliza, Spark deja de ofrecer esta interfaz y ya no es posible acceder a las métricas de performance. Por lo tanto, para poder seguir analizandolo y no perder esa información, se debe configurar Apache Spark para que genere un archivo de logs con la información de la aplicación ejecutada y levantar un servidor web para reconstruir la interfaz de monitoreo. Los pasos a seguir son los siguientes:
-
Crear el directorio donde se almacenarán los logs de Spark
mkdir /tmp/spark-events
-
Copiar el template
conf/spark-defaults.conf.template
y crear el archivoconf/spark-defaults.conf
en el directorioconf
de Sparkcp spark-defaults.conf.template spark-defaults.conf
-
Descomentar la siguiente línea en el archivo
conf/spark-defaults.conf
y guardar los cambiosspark.eventLog.enabled true
Esta línea habilita la generación de logs de Spark para cada aplicación ejecutada.
-
Descomentar la siguiente línea en el archivo
conf/spark-defaults.conf
y guardar los cambiosspark.eventLog.dir file:///tmp/spark-events
Esta línea indica el directorio donde se almacenarán los logs de Spark.
Ahora, luego de levantar el nodo master y los nodos workers, se debe levantar un servidor web para reconstruir la interfaz de monitoreo.
Para esto, se debe ejecutar el siguiente comando desde el directorio sbin
de Spark:
./start-history-server.sh
Luego, se puede acceder a la interfaz de monitoreo desde el navegador web en la dirección http://localhost:18080
.
En la salida se informará la ubicación del archivo de logs que genera el servidor web, por ejemplo:
starting org.apache.spark.deploy.history.HistoryServer, logging to /mnt/c/Users/Axel/Downloads/spark-3.5.0-bin-hadoop3/logs/spark-axel-preitit-org.apache.spark.deploy.history.HistoryServer-1-DESKTOP-K6FJ9D4.out
Se recomienda utilizar el comando tail -f
para monitorear el archivo de logs:
tail -f /mnt/c/Users/Axel/Downloads/spark-3.5.0-bin-hadoop3/logs/spark-axel-preitit-org.apache.spark.deploy.history.HistoryServer-1-DESKTOP-K6FJ9D4.out
Si se desea detener el servidor web, se debe ejecutar el siguiente comando desde el directorio sbin
de Spark:
./stop-history-server.sh
Para más información, consultar la documentación oficial de Apache Spark.