La arquitectura de Spark cuenta con un diseño modular que le permite adoptar diferentes configuraciones según la necesidad. Además de la flexibilidad que le aporta a Spark su diseño de programación, el modelo de computación maestro-esclavo le aporta escalabilidad y tolerancia a fallos, convirtiéndole en un todoterreno del Big Data.
Apache Spark es una de las herramientas más utilizadas en Big Data. En este artículo vamos a abordar la arquitectura de Spark tanto a nivel de software, como a nivel de hardware. Cada uno de estos enfoques le aporta a la herramienta características diferentes, que unidas definen el potencial de la herramienta.
Primero hablaremos de la parte software y su modelo de programación, que nos va a permitir entender la lógica del sistema. Y después hablaremos sobre su parte más física, su modelo de computación.
Arquitectura de Spark: el motor del Big Data
El motor de Spark lo conforman un conjunto de piezas, que unidas, le aportan las propiedades básicas. Estas piezas básicas que definen su funcionamiento, las podemos organizar en capas que se sustentan unas sobre otras, como si fuese una tarta.
Aunque la estructura de Spark es rígida y siempre debemos tener estas piezas básicas como pilares, su diseño modular nos permite trabajar con ellas de manera independiente, lo que nos va a dar una gran flexibilidad a la hora de desarrollar nuestros proyectos.
Administrador de tareas
Administrador de recursos del clúster
Sistema de almacenamiento distribuido
¡Sin una de estas piezas ningún programa de Spark puede funcionar! A continuación, vamos a explicar cada uno de los pilares sobre los que se cimienta esta tecnología.
Sistema de almacenamiento distribuido
Spark no cuenta con una capa de almacenamiento, por lo que necesitamos un sistema de almacenamiento sobre el que apoyar la plataforma, además este deberá ser distribuido. Tendremos que usar algún sistema de almacenamiento externo para la gestión de los datos, como pueden ser el sistema de archivos distribuido HDFS, o los sistemas de bases de datos distribuidas HBase, MongoDB o Cassandra.
Esto nos aporta flexibilidad a la hora de procesar los datos, ya que al poder usar diferentes orígenes de datos, podremos elegir el que mejor se adapte a nuestro proceso.
Administrador de recursos del clúster
Sobre la capa de almacenamiento, se encuentra la capa de procesamiento. El administrador de recursos es la pieza dentro del motor de Spark que aporta a la plataforma la capacidad de gestionar los recursos disponibles en el clúster de manera autónoma.
Por defecto Spark cuenta con Spark Standalone Scheduler, un gestor de nodos muy básico. Así que generalmente nos apoyaremos sobre un administrador más potente como Mesos o YARN.
Administrador de tareas
Finalmente, sobre el sistema de almacenamiento que nos permite leer y escribir la información, y sobre el administrador de recursos que nos permite gestionar el procesamiento distribuido de los datos; situamos la pieza que gestiona las tareas a ejecutar.
Esta pieza es la base en la que se apoyarán el resto de módulos, es el núcleo del framework. Conocida como Spark Core, realmente es la pieza sobre la que trabajan todas las aplicaciones y es la que conocemos como Spark.
Extensiones: aumentando las funcionalidades de Spark
Estas capas de almacenamientos, procesamiento y planificación, sirven como base en la que desplegar diferentes complementos que aportan nuevas funcionalidades al sistema. Los propios desarrolladores de Spark han trabajado en varias librerías que extienden el alcance de esta herramienta, aunque también otros equipos trabajan desarrollando complementos sobre Spark.
Los módulos que podemos encontrar dentro del proyecto de Spark son:
- Spark SQL: esta librería está diseñada para el tratamiento y consulta de datos estructurados y semi-estructurados. Con este módulo vamos a poder crear, transformar y realizar operaciones sobre estas estructuras de datos.
- Spark ML y MLlib: estas librerías nos permiten realizar aprendizaje automático (machine learning) de manera escalable.
- Spark Streaming: esta librería nos permite construir aplicaciones escalables y tolerantes a fallos para el tratamiento de datos en tiempo real (micro-batching). Con este módulo podemos recibir datos de una fuente en tiempo real, transformarlos y dejarlos en un destino.
- Spark GraphX: esta librería nos permite el cómputo de grafos sobre Spark. Este módulo está disponible para menos lenguajes de programación que los anteriores, únicamente para Scala y Java.
Estas librerías comunes aumentan la productividad de los usuarios y pueden combinarse para crear flujos de trabajo complejos, creando así un motor unificado de procesamiento de datos a gran escala.
Spark SQL
Spark ML
Spark Streaming
Spark GraphX
Spark
Arquitectura maestro-esclavo
Acabamos de ver cómo se organiza el modelo de programación de Spark, pero ¿qué pasa con su modelo de computación? Spark es un framework de computación distribuida, lo que significa que vamos a tener varias máquinas interconectadas operando como una sola. Estas máquinas para organizarse necesitan una red por la que enviarse mensajes y establecer relaciones bien definidas entre ellas para realizar el trabajo. En este caso, tenemos un modelo maestro-esclavo en el que contamos con una organización jerárquica en la que una máquina, que denominaremos maestro, coordina el trabajo de otras, que llamaremos esclavos o trabajadores.
Escalabilidad
El modelo maestro-esclavo permite quitar o añadir máquinas a la red en cualquier momento sin tener que reiniciar el sistema. Esto permite que Spark pueda escalar aumentando o disminuyendo los recursos durante la ejecución de un proceso, según sea necesario.
Tolerancia a Fallos
Además, si uno de los nodos trabajadores de la red falla, su trabajo es asignado al resto de nodos trabajadores mientras el nodo afectado se recupera.
Disponibilidad
Sin embargo, el modelo de arquitectura maestro-esclavo tiene un punto débil en el nodo máster. Y es que este es crítico, si este nodo falla se pierde el punto de contacto de todas las conexiones del sistema y la ejecución del proceso fracasa. Para solucionar esto, existen otras herramientas como Apache Zookeeper que se encarga de reemplazar el nodo maestro por otro en caso de fallo para que el proceso pueda continuar hasta su finalización.
Como hemos visto, cuando hablamos de la arquitectura de Spark podemos hablar sobre la arquitectura software y su diseño modular, o sobre su arquitectura computacional basada en un modelo distribuido. Su diseño modular le aporta flexibilidad y le permite incorporar nuevas funcionalidades que le hacen más completo aún. Mientras que la arquitectura distribuida, le brinda la escalabilidad y la tolerancia a fallos por las que destaca entre los proyectos de Big Data.