Arquitectura Apache Spark

Alonso Medina Donayre
7 min readSep 29, 2022

--

En este artículo te estaré hablando sobre todo lo relacionado a la arquitectura de Spark enfocado a la certificación Databricks Certified Developer for Spark 3.0 y también para que te ayude en tu vida profesional, tal vez alguna entrevista.

Los requisitos que solicita la certificación son los siguientes:

1. Entender los fundamentos de la arquitectura de Spark.
2. Adaptive Query Execution, Partitioning, Caching and Persist, Transformations and Actions, Shuffling, Accumulators
3. Manipulación de la Spark Dataframe API
- selecting, renaming and manipulating columns
- filtering, dropping, sorting, and aggregating rows
- joining, reading, writing and partitioning DataFrames
- working with UDFs and Spark SQL functions

Qué es un cluster?

Un cluster es un conjunto de computadoras que son vistas como un solo sistema.

Ejemplo (Configuración de un cluster):
- Capacidad de cada worker node: 16 CPU cores, 64 GB RAM
- Total workers: 10
- Capacidad total del cluster: 160 CPU cores 640 GB RAM

Qué es un worker?

Los workers o workers nodes son responsables de proveer los recursos fisicos al framework de Spark. Un worker tiene los recursos fisicos de CPU, RAM y almacenamiento del sistema. Los workers son quienes facilitan el procesamiento distribuido a Spark. Una aplicación de Spark puede tener uno o más workers.

Runtime Application (Spark + YARN)

Como corre un programa de spark sobre un cluster?

  • Todo inicia cuando ejecutamos un spark-submit y enviamos nuestra aplicación al resource manager (en el ejemplo YARN RM).
  • El resource manager verifica si se tienen recursos disponibles en el cluster, de ser así, solicita a un Node Manager crear nuestra aplicación llamada Application Master en un contenedor.

Nuestra aplicación puede estar escrita en PySpark (Python) o Scala.
Spark está escrito por defecto en Scala que corre sobre un Java Virtual Machine (JVM), para llevar Spark hacia Python se tuvo que crear un Java Wrapper sobre Spark (escrito en Scala) y luego se creó un Python Wrapper sobre el de Java. El Python Wrapper se comunica con el Java Wrapper a traves de una conexión Py4J (permite que una aplicación python invoque a una aplicación java).

  • Nuestra aplicación en PySpark inicializa la aplicación Java y esta llama a las API’s de Spark en la JVM. El main de PySpark será nuestro PySpark Driver mientras que el main de Java será el Application Driver.

Nota: Solo tendremos un PySpark Driver cuando escribimos aplicaciones en este lenguaje si lo hacemos en Scala solo tendremos el Application Driver.

  • Ahora nuestro Application Driver solicitará recursos a nuestro Resource Manager, este creará Spark Executor Containers y los asignará a nuestro driver para que ejecuten las tareas. Nuestros ejecutores también son JVM.

Nota: Si utilizamos librerías de Python o Python UDF’s vamos a tener un Python Worker en cada executor, el cuál es un ambiente de ejecución de Python (Python Runtime Environment).
Si usamos única y exclusivamente PySpark no tendremos este Python Worker, debido a que PySpark convierte el código a lenguaje Java.

  • En el siguiente gráfico podemos observar todos los pasos descritos con aterioridad de manera resumida.

Spark Submit

Spark-submit es un commando que nos permite ejecutar Spark Applications en un cluster. Es importante conocer algunas de sus opciones.

Cluster Manager

  • El cluster manager se encarga de administrar los recursos del mismo.
  • El driver se comunica con el cluster manager a traves del SparkContext, de esta manera el driver solicita recursos para que se desplieguen los executors.

Actualmente se soportan distintos tipos de cluster manager.

— Standalone

Es un cluster manager que viene incluído con spark, una de sus limitaciones es que Apache Spark debe ser el único framework corriendo en el Cluster. Si quisieramos correr multiples frameworks de manera paralela en el mismo cluster como Apache Spark y Apache Flink, deberíamos considerar YARN.

— YARN

El resource manager de Hadoop 2 y 3, nos permite trabajar con multiples frameworks en el mismo cluster.

— Mesos

Un cluster manager que permite trabajar con MapReduce, sin embargo ya esta deprecado.

Driver Program

Es el responsable de proveer y coordinar los recursos necesarios para la ejecución de una aplicación. Solo existe un driver por aplicación.

Cuando enviamos una aplicación a través del comando spark-submit, el Driver toma la aplicacion y realiza distintas tareas que ayudan a identificar todas las transformaciones y acciones que existen en la aplicación. Todas estas operaciones son agrupadas en un flujo lógico (logical plan) el cuál es llamado DAG(Directed acyclic graph). Luego el DAG es convertido en un plan de ejecución físico (physical plan).

DAG

Un DAG es un grafo acíclico dirigido, lo cual quiere decir que no presenta ciclos. Un Dag contienen la jerarquia de ejecución de Spark. Estos comprenden los jobs, los cuales consisten en stages y estos a su vez en tasks. Los Dag’s representan la ejecución lógica y son de tipo lazy, es decir se ejecutará cuando se invoque una acción.

Jobs -> Stages -> Tasks

Executors

Los executors son responsables de realizar la ejecución de las tareas que son asignadas por el Driver que luego de ser ejecutadas retornan al driver. En un cluster un worker node puede estar compuesto por uno o mas executor donde cada executor tiene una cantidad de recursos asignados (CPU, RAM, Almacenamiento) pueden almacenar data en memoria o disco. El tiempo de vida de un executor es corto, cuando una aplicación termina de ejecutarse los executors finalizan. Los slot son la cantidad de CPU disponibles que tiene un executor, estos ayudan a paralelizar la ejecución de tareas.

Nota: En el caso de databricks, el concepto de executor y worker es el mismo. Es decir, solo indicamos la cantidad de workers/executor y la capacidad de estos (CPU, RAM, Almacenamiento).

Shuffling

Shuffling es el proceso utilizado para redistribuir la data a través de los nodos del cluster, se mueven los datos a traves de la red, shuffle agrupa la data en buckets donde cada bucket conforma una partición.

Job

Es el procesamiento de un algoritmo en Spark. Una aplicación de Spark puede tener uno o más jobs dependiendo de su procesamiento.

Stage

Un stage consiste de múltiples tasks (tareas), cuando ejecutamos un job, Spark configura la cantidad de stage necesarios (stage 1, stage 2). Cada Stage está delimitado por una acción de shuffling, es decir, se crea un nuevo stage cada vez que tenemos que mover data en la red.

Tasks

Una tarea o task en inglés, es la unidad mas simple y básica de procesamiento en Spark. Estas se ejecutan en los executors. Las tareas de spark siempre estan basadas en el particionamiento de nuestra data, esto nos permite que puedan ser ejecutadas de manera paralela por uno o mas executors.

Spark Deploy Modes

— Cluster Mode

Cuando usamos este modo nuestro Application Driver se ejecuta sobre un contenedor dentro de uno de los workers nodes del cluster. Algunas ventajas de este modo es que una vez realizado el spark-submit podemos desconectarnos de nuestra máquina cliente, el tiempo de latencia entre el driver y los executor es mínimo.

En ambientes de producción siempre debemos optar por usar Cluster Mode.

— Client Mode

Cuando usamos este modo nuestro Application Driver se ejecuta en la maquina cliente. Este modo es usado por spark-shell, notebooks de manera interactiva, sin embargo se genera una dependencia entre el cliente y el cluster. Si el cliente sufre algun daño o se apaga, el driver muere y los executors asignados al driver quedan huerfanos por lo que el Resource Manger termina el proceso.

— Local Mode

En modo local toda la infraestructura de Spark se aloja en una sola JVM dentro de una sola computadora, el driver y el resource manager tambien se encuentran alojados.

FIN

Este es el final del presente artículo, pero no el de mis publicaciones, estaré realizando otro artículo enfocado al punto 2 que son conceptos necesarios para la certificación y cualquier entrevista laboral. Espero la información brindada te sea de mucha utilidad, puedes seguirme en LinkedIn.

--

--

Alonso Medina Donayre

I am very interested in topics related to Data, Software and Management.