10 conceptos que debes saber antes de comenzar con Spark — Parte 1
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)
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.
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.
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:
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.
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
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.
· Clúster (Nodes, Executors, Slots/Cores/Threads)
∘ Nodos
∘ Core/Thread/Slot
· Jerarquía de Ejecución en Spark
∘ Aplicación
∘ Jobs
∘ Stages
∘ Tasks
· Distribución en Spark
∘ Partición (Partitions)
∘ Shuffle
· Patrones de Ejecución
∘ Evaluación perezosa (Lazy Evaluation)
∘ Transformaciones
∘ Acciones (Actions)