Big Data con Apache Spark (I): Introducción

, , 1 comment
Estamos en la era de los datos o el denominado Big Data. Disponemos de tal cantidad de datos, que los tradicionales sistemas de almacenamiento, gestión y procesamiento de los mismos ya no son válidos. Es por ello que en los últimos años han aparecido multitud de herramientas y frameworks para gestionar grandes cantidades de datos de forma eficiente. Una de estas herramientas es Apache Spark.



En esta entrada hablaré de este framework de procesamiento y análisis distribuido de datos, mostrando una introducción básica al mismo. En siguientes entradas mostraré más funcionalidades con ejemplos más complejos.

Para seguir esta entrada se necesitan las siguientes herramientas.

¿Qué es Apache Spark?

Spark es un framework de procesamiento y análisis distribuido de grandes cantidades de datos en memoria. Dispone de diversos módulos que permiten aplicar operaciones sobre datos, realizar consultas, procesamiento de grafos, stream processing y aplicación de algoritmos de machine learning de una forma eficiente y escalable. Al ser un entorno de computación en memoria, Spark puede conectarse a repositorios de datos externos como HBase, Cassandra, MongoDB, etc. donde residen datos persistentes.

Spark está escrito en Scala, un lenguaje de programación funcional soportado por la máquina virtual Java (JVM). De esta forma, el código Scala se compila y se convierte en bytecode Java, por lo que un programa escrito en Java es perfectamente interoperable con otro escrito en Scala.

El framework Spark dispone de una API para poder implementar aplicaciones de procesamiento y análisis de datos. Esta API se encuentra soportada por lenguajes de programación como Java o Python, aunque lo más natural es utilizar Scala, ya que es el lenguaje de programación que sustenta Spark.

Arquitectura de Spark

Los principales componentes de Spark son los que se describen a continuación:
  • Workers: son los nodos donde se ejecutan de forma distribuida las operaciones o tareas de las aplicaciones Spark.
  • Cluster manager: gestiona los workers. Spark dispone de su propio manager, aunque también soporta los gestores Mesos y YARN.
  • Driver program: es la aplicación principal. Las diferentes tareas que se implementen en esta aplicación serán las que se distribuyan por los workers del clúster para la realización en paralelo de las diferentes operaciones requeridas.

API de Spark

Antes de entrar en materia y poner un sencillo ejemplo de procesamiento de datos con Spark, es conveniente entender algunos conceptos básicos de la API.
  • SparkContext: facilita la conexión de la aplicación con un clúster Spark.
  • Resilient Distributed Dataset (RDD): un RDD es una colección de elementos que puede particionarse para ser tratados en paralelo. La API proporciona métodos para conectarse a diferentes repositorios de datos (Hadoop, Cassandra, etc.) y crear RDDs. La creación de un RDD es una operación "lazy", es decir, que Spark no realiza ninguna acción al momento, sino que realiza una programación de dicha operación hasta que ocurra alguna acción sobre los datos del RDD. Las operaciones que pueden realizarse sobre un RDD son transformaciones y acciones.
  • Transformaciones: una operación de transformación sobre un RDD devuelve un nuevo RDD al que se le aplica cierta operación. Por ejemplo, aplicar una determinada función a los elementos del RDD (p. ej. multiplicar por 2 cada elemento), filtrar los elementos en base a una condición determinada, etc.
  • Acciones: las acciones devuelven un valor a la aplicación o Driver program. Por ejemplo, contar los elementos de un RDD, calcular el máximo, el mínimo o guardar el contenido de un RDD en un fichero son ejemplos de acciones sobre un RDD.

Ejemplo con Apache Spark

Para empezar a trabajar con Spark necesitaremos descargar y descomprimir el IDE Scala, que está basado en Eclipse. Para lanzar el entorno ejecutaremos el archivo eclipse.exe. Después, descargaremos el proyecto con el código fuente del repositorio GitHub en este enlace.

Ahora veremos un ejemplo muy sencillo en el que filtraremos una lista de números para obtener los que sean pares. En primer lugar crearemos un objeto llamado NumerosPares que extienda de App (línea 6) dentro del fichero de nombre NumerosPares.scala. Con esto, estamos definiendo una nueva aplicación de Scala, que ejecutará el código contenido en el propio objeto.

Configuraremos una conexión a un clúster Spark, en este caso local, mediante el objeto SparkConf, que después utilizaremos para instanciar un objeto de tipo SparkContext. Después crearemos un RDD partiendo de una lista de 10.000 números. Sobre este RDD de nombre listaNumerosRdd, realizaremos una transformación mediante un filtro. El filtro aplicará una función para obtener un nuevo RDD que solamente contenga los números pares. La notación utilizada en la función mediante la barra baja "_" es equivalente a escribir { x => x % 2 == 0} (línea 15).

Finalmente aplicaremos una acción sobre el RDD, para contar el número de elementos pares que después visualizaremos por consola.


Para ejecutar la aplicación, nos posicionaremos con el ratón en el fichero NumerosPares.scala, pulsando con el botón derecho del ratón y seleccionando Run As -> Scala Application.

Conclusiones

Spark es un entorno con múltiples funcionalidades, que simplifica enormemente la gestión de grandes cantidades de datos de forma transparente. La magia de Spark reside en que el programa escrito en el ejemplo, puede ejecutarse tanto en un clúster local, como en un clúster distribuido compuesto por multitud de nodos sin cambiar ni una sola línea de código.

En siguientes entradas veremos ejemplos más completos de la API Spark para la gestión de grandes cantidades de datos, así como otros módulos ofrecidos por el framework como los de consulta de datos o el de aplicación de algoritmos de machine learning.

Pulsa aquí para acceder al código de esta entrada en mi repositorio GitHub

1 comentario:

  1. Sin duda, Apache es mi favorito cuando debo montarme servidores y hosting caseros para pruebas, me simplifica mucho el trabajo

    ResponderEliminar