Iniciarse en Apache Spark (III): un primer ejemplo en Scala


Después de convertirnos en los «bestias pardas» desplegando clústeres en Spark, conocer lo básico y hablar de Scala, es hora (o eso creo), de hacer algo combinando lo que hemos visto, ¿no creeis? 😉

Para calentar motores, vamos a desarrollar un ejemplo simple y muy clásico cuando se trabaja con Map-Reduce: un contador de palabras.

Concretamente, vamos a contar las palabras del siguiente archivo de texto:

Para poder hacer este pequeño ejemplo no es necesario instalar un entorno de desarrollo, basta con entrar en la shell de Spark (ejecutar spark-shell desde el terminal) y picar código directamente.

En el arranque de la consola podemos sacar información interesante:

  1. Interfaz web (192.168.1.37:4040) donde podemos obtener información acerca de los trabajos, planificación y recursos, entre otras cosas.
  2. Variable de entorno Spark Context, llamada sc, a partir de la cual se generan los RDD.
  3. Sesión de Spark, llamada spark.

La lógica

Aunque pueda parecer una tontería, la mayoría de las veces en las que mis códigos no funcionan (y no son pocos XD ), son debidos al planteamiento que hago de los programas, por lo que de un tiempo para acá he cogido por costumbre enumerar los pasos a dar antes de picar código:

  1. Crear un RDD con el archivo completo.
  2. Separar el archivo linea a linea para procesar cada una por separado.
  3. Separar el contenido de cada línea en palabras, es decir, por espacios.
  4. Comprobar si la palabra ya se ha leído: en caso afirmativo se aumenta el contador.
  5. Guardar los resultados en un archivo de texto.

El código

Partiendo de la lógica que se ha descrito antes, es hora de ponernos a picar código y hacer que nuestra idea funcione:

 
val archivo = sc.textFile("ruta_del_archivo_entrada")
val contador = archivo.flatMap(linea => linea.split(" "))
                 .map(palabra => (palabra, 1))
                 .reduceByKey(_ + _)
contador.saveAsTextFile("directorio_salida")

NOTA: Se recomienda ejecutar el código línea a línea, concatenando en una sola la 2, 3 y 4.

El resultado

Tras haber ejecutado el código anterior, podemos acceder al directorio y observar los archivos generados:

Quizás alguno se pregunte porqué hay 3 ficheros: Como ya sabemos (o deberíamos), Spark trabaja de forma paralela, por lo que el trabajo se ha repartido por defecto en 2, de tal forma que cada uno procesa una parte del archivo y genera un archivo resultante. El archivo _SUCCESS no tiene contenido alguno; la verdad es que desconozco el motivo del por qué se genera el archivo, aunque sospecho que será algún tipo de «aviso» para verificar que se ha acabado la ejecución de forma correcta.

Veamos los ficheros generados:

Como aclaración decir que al haber separado las palabras por espacios, los demás signos de puntuación (puntos y comas) han sido tomados como parte de la palabra anterior.

Conclusiones

En este pequeño ejemplo se puede ver cómo con pocas líneas de código se pueden paralelizar ejecuciones (aunque lo hayamos hecho en una sola máquina).

Además, aunque el código sea corto, está claro que al principio no es tan intuitivo y/o fácil como puede serlo otro lenguaje de programación. De hecho, aunque esté trabajando y peleándome con este lenguaje, se me escapan todavía la mayoría de funcionalidades y funciones que ofrece.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.