10 conceptos que debes saber antes de comenzar con Spark — Parte 1

Shamuel Manrrique
6 min readJan 24, 2023

--

Reference: https://spark.apache.org/

Apache Spark™ es un motor multilenguaje para ejecutar ingeniería de datos, ciencia de datos y aprendizaje automático en clústeres o máquinas de un solo nodo.

En otras palabras, podríamos decir que es un motor de análisis unificado para el procesamiento de Big Data y el mayor proyecto de código abierto en procesamiento paralelo de datos. En este artículo vamos a explicar de forma sencilla y estructurada los conceptos básicos de la arquitectura y el funcionamiento de Spark. Así como también indicar los vínculos que existen entre ellos.

Clúster (Nodes, Executors, Slots/Cores/Threads)

IBM define los clústeres son grupos de nodos(servidores) que se gestionan juntos y participan en la gestión de carga de trabajo.

Nodos

Los nodos son máquinas individuales dentro de un clúster (generalmente máquinas virtuales). En Spark se dividen en dos tipos:

  • Driver nodes

En español nodo conductor o maestro es el encargado de ejecutar la aplicación. Asignar recursos y tareas, además de coordinar el trabajo entre los distintos slots de un executor. Por último, recibe el resultado. En resumen podríamos decir que es el responsable de estas tres cosas:

— Mantener la información sobre la aplicación de Spark.

— Responder al programa de uso o interfaz del usuario.

— Analizar, distribuir y programar el trabajo entre ejecutores.

  • Worker nodes (Executors)

Los nodos ejecutores son los encargados de proporcionar un entorno donde las tareas se pueden llevar a cabo. Aprovecha los beneficios que aporta la Java Máquina Virtual (JVM por sus siglas en inglés) para ejecutar muchos subprocesos. Los subprocesos situados en la misma máquina son capaces de compartir recursos, mientras que los situados en distintos nodos no. Los ejecutores son responsables de dos cosas:

— Ejecutar el código asignado por el Driver.

— Informar del resultado del cálculo al Driver.

Figura 1: Spark Cluster

Nota: En Databricks tanto el driver como cada executor(worker node) se ejecutan en un nodo propio. En otros entornos un worker node puede tener más de un executor.

Figura 2: Diferentes formas de ejecución en nodos presentes en Spark y compartimiento de recursos.

Core/Thread/Slot

En muchos contextos se suele usar como términos equivalentes, pero técnicamente no lo son.

  • Core

Se refiere a un componente de hardware real. Un core, o núcleo de la CPU, es el “cerebro” de una CPU. Recibe instrucciones y realiza cálculos u operaciones para satisfacer esas instrucciones. Una CPU puede tener uno o múltiples núcleos que permiten atender múltiples peticiones en paralelo.

La mayoría de los procesadores pueden usar un proceso llamado subprocesos múltiples simultáneos o, Hyper-threading(los dos términos significan lo mismo) para dividir un núcleo en núcleos virtuales, lo que se llaman threading.

  • Thread

Un Hilo o thread se refiere a un componente virtual capaz de manejar una tarea de forma concurrente. Multithreading o multihilos es una técnica que permite que una CPU ejecute muchas tareas de un proceso al mismo tiempo. Estos subprocesos pueden ejecutarse individualmente mientras comparten sus recursos.

  • Slot

Es el último término y no menos importante, es el que se suele emplear con mayor frecuencia en el entorno Spark. Con él se suele indicar threads o subprocesos disponibles para asignarles trabajo paralelo.

Jerarquía de Ejecución en Spark

El secreto del rendimiento de Spark es la paralelización. Para sacar el mayor partido, Spark hace una ejecución jerárquica usando lo que se denomina Directed Acyclic Graph(DAG, por sus siglas en inglés) esto le permite abordar y dividir el trabajo en las siguientes fases:

Figura 3: Jerarquía de Ejecución en Spark. La aplicación consiste en cero o más jobs. Los jobs están formados en uno o más stages. Los stages pueden estar formados por una o más task.

Aplicación

La aplicación en Spark constan de un proceso controlador y un conjunto de procesos ejecutores. El proceso del controlador ejecuta su función principal. La aplicación consiste en cero o más jobs.

Jobs

Un Spark Job es una única acción de cálculo que sé instancia para completar una Spark Action. Consiste en uno o más stages.

Stages

Un Stage o etapa son cálculos que producen resultados intermedios, que de hecho pueden o no persistir. Consiste en una o más task. Sin embargo, un stage no se puede completar hasta que se completen todas las tareas asociadas a dicha etapa. En versiones posteriores de Spark 3.x se puede ejecutar algunas etapas en paralelo.

Tasks

Una unidad atómica de trabajo encargada de realizar alguna operación a una sola partición de datos. En otras palabras, es la unidad más pequeña de trabajo.

Figura 4: Ejecución de Spark detallada

Distribución en Spark

Partición (Partitions)

Una partición en Spark es un fragmento atómico de dato (división lógica de datos). Generalmente, suelen ser una porción de no más de 128 MB. Cada tarea procesa una y solo una partición. Es el driver el encargado de decidir el tamaño y las divisiones del conjunto de datos. El tamaño inicial es parcialmente ajustable en Spark mediante configuraciones.

Shuffle

El Shuffle es el proceso de reorganizar datos dentro de un grupo entre stages. Son disparadas por operaciones de “wide actions” entre las más comunes se pueden mencionar:

Re-partitioning
ByKey
Joins el peor es cross joins
Storting
Distinct
GroupBy

Patrones de Ejecución

Evaluación perezosa (Lazy Evaluation)

Es Otra característica destacada de Apache Spark. La evaluación perezosa en Spark significa que la ejecución no comenzará hasta que se active una acción.

Transformaciones

Las transformaciones son acciones en Spark que dependiendo de su naturaleza pueden ser categorizadas en los siguientes dos tipos:

  • Narrow Transformations

En la transformación Estrecha, todos los elementos que se requieren para llevar a cabo el trabajo viven en la partición única. No requiere conocer información del resto de particiones o conjunto de datos.

  • Wide Transformations

En la transformación amplia, todos los elementos que se requieren para llevar a cabo el trabajo pueden residir en muchas particiones del conjunto de datos. Esta operación puede causan mayor degradación en el rendimiento. Una buena práctica que se suele seguir es tratar de agruparlas para permitirle a Spark optimizar o reducir el número de stages.

Mala práctica: wide, narrow, wide, narrow, wide, narrow

Buena Práctica: narrow, wide, wide, narrow, narrow, wide

Figura 5: Particiones y shuffle

Acciones (Actions)

Las acciones son operaciones que devuelven los valores sin procesar. En otras palabras, cualquier función de Spark que devuelva algo que no sea un dataframe se considera una acción en la programación Spark. Son las encargadas de disparar el procesamiento.

Para concluir

Este blog no trata de sustituir la documentación y mucho menos, se busca es dar un vuelo de pájaro sobre conceptos que desde mi punto de vista son básicos cuando comenzamos a trabajar con Spark y muchas veces no sabemos diferenciar del todo. Existen otros conceptos de gran importancia que serán abordados en futuras publicaciones. Suscríbete para más contenido como este.

--

--

Responses (2)