Arquitectura Spark
Explora la arquitectura Spark: driver, ejecutores, administradores de clúster incluyendo Standalone, YARN y Kubernetes
Arquitectura Spark
Entender la arquitectura distribuida de Spark es esencial para escribir aplicaciones eficientes y diagnosticar problemas de rendimiento. Spark sigue un patrón maestro-esclavo con un driver central coordinando procesos ejecutores distribuidos.
Arquitectura de Alto Nivel
Las aplicaciones Spark se ejecutan como conjuntos independientes de procesos coordinados por un SparkContext en el programa driver.
+---------------------+
| Driver Program |
| (SparkContext) |
+----------+----------+
|
Cluster Manager
(Standalone/YARN/K8s)
|
+-----+------+
| |
+----+----+ +----+----+
| Executor | | Executor |
| Core 1 | | Core 1 |
| Core 2 | | Core 2 |
| ... | | ... |
+----------+ +----------+
Driver
El driver es el coordinador central de una aplicación Spark. Ejecuta la función main() del usuario y crea el SparkContext (o SparkSession en Spark moderno).
Responsabilidades del Driver
- Convertir código de usuario en tareas: El driver transforma transformaciones en un DAG (Directed Acyclic Graph) de etapas y tareas
- Programar tareas: Asigna tareas a ejecutores basándose en la localidad de los datos
- Coordinar ejecución: Sigue el progreso de las tareas, maneja fallos
- Gestionar el SparkContext: Mantiene el estado y configuración de la aplicación
El driver debe ser accesible desde todos los ejecutores a través de la red. Si la máquina del driver falla, toda la aplicación falla. Para producción, ejecute drivers en infraestructura resiliente.
Ejecutores
Los ejecutores son procesos de trabajo que ejecutan tareas y almacenan datos.
Responsabilidades de los Ejecutores
- Ejecutar tareas: Ejecutan código asignado por el driver
- Almacenar datos: Cachean RDDs, DataFrames o variables de broadcast en memoria o disco
- Reportar resultados: Envían resultados de vuelta al driver
Configuración de Ejecutores
Parámetros clave de ejecutor en spark-submit:
# 4 ejecutores, cada uno con 4 núcleos y 8GB de memoria
spark-submit \
--num-executors 4 \
--executor-cores 4 \
--executor-memory 8g \
app.pySolicitar demasiados núcleos por ejecutor (>5) puede causar contención de E/S en HDFS. Una regla general es 3-5 núcleos por ejecutor.
Administradores de Clúster
Spark soporta varios administradores de clúster que manejan la asignación de recursos entre máquinas.
Modo Standalone
Administrador de clúster simple integrado de Spark.
| Característica | Detalles |
|---|---|
| Configuración | Iniciar scripts master y worker |
| Escalabilidad | Bueno para clústeres pequeños a medianos |
| Alta Disponibilidad | Failover basado en ZooKeeper |
| Mejor para | Aprendizaje, desarrollo, pequeñas implantaciones de producción |
# Iniciar clúster Standalone
./sbin/start-master.sh
./sbin/start-worker.sh spark://host:7077
# Enviar aplicación
spark-submit --master spark://host:7077 app.pyModo YARN
Administrador de recursos de Hadoop, ideal para clústeres que ya ejecutan Hadoop.
| Característica | Detalles |
|---|---|
| Modos | yarn-client (driver en cliente) y yarn-cluster (driver en YARN) |
| Integración | Perfecta con HDFS y otras herramientas Hadoop |
| Seguridad | Autenticación Kerberos, ACLs |
| Asignación Dinámica | Soportada nativamente |
| Mejor para | Organizaciones que ya usan el ecosistema Hadoop |
# Modo YARN cluster (driver ejecuta dentro de YARN)
spark-submit --master yarn --deploy-mode cluster app.py
# Modo YARN client (driver ejecuta en máquina que envía)
spark-submit --master yarn --deploy-mode client app.pyEn modo yarn-cluster, el driver ejecuta dentro de un contenedor ApplicationMaster. Si falla, YARN lo reinicia. Esto es más resiliente que el modo client.
Modo Kubernetes
Orquestación moderna de contenedores para ejecutar Spark.
| Característica | Detalles |
|---|---|
| Implantación | Contenedores Docker gestionados por K8s |
| Aislamiento de Recursos | Namespaces, cuotas de recursos |
| Auto-escalado | Auto-escalado horizontal de pods |
| Mejor para | Arquitecturas cloud-native, organizaciones ya en K8s |
# Modo Kubernetes
spark-submit \
--master k8s://https://<k8s-api-server> \
--deploy-mode cluster \
--conf spark.kubernetes.container.image=spark:3.5 \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
app.pyComparación de Administradores de Clúster
| Característica | Standalone | YARN | Kubernetes |
|---|---|---|---|
| Complejidad de Configuración | Baja | Media | Alta |
| Escalabilidad | Media | Alta | Alta |
| Multi-inquilino | Limitada | Excelente | Excelente |
| Asignación Dinámica | Sí | Sí | Sí (v3.3+) |
| Soporte a Contenedores | No | No | Nativo |
| Mejor para | Dev/Pequeña Prod | Entornos Hadoop | Cloud Native |
Ciclo de Vida de la Aplicación
- Usuario envía aplicación mediante
spark-submit - Driver inicia y conecta al administrador de clúster solicitando recursos
- Administrador de clúster asigna contenedores ejecutores
- Ejecutores se registran con el driver
- Driver transforma el código del usuario en un DAG, divide en etapas y tareas
- Driver programa tareas a ejecutores basándose en la localidad de los datos
- Ejecutores ejecutan tareas y devuelven resultados (o hacen spill a disco)
- Aplicación completa y libera todos los recursos
Localidad de los Datos
Spark intenta programar tareas cerca de sus datos para minimizar la transferencia de red.
| Nivel de Localidad | Descripción |
|---|---|
| PROCESS_LOCAL | Datos en la misma JVM que la tarea |
| NODE_LOCAL | Datos en el mismo nodo (JVM diferente) |
| RACK_LOCAL | Datos en el mismo rack |
| ANY | Datos en cualquier lugar del clúster |
La localidad de los datos es una de las optimizaciones más importantes de Spark. Procesar datos donde ya están evita costosas transferencias de red.
Particiones y Paralelismo
Una partición es un bloque lógico de datos procesado por una tarea. El número de particiones determina el paralelismo.
Archivo: 1 GB en HDFS (tamaño de bloque 128 MB)
Particiones: ~8 particiones
Tareas: Hasta 8 tareas ejecutándose en paralelo
Conclusiones Clave
- El driver coordina la aplicación y convierte código en tareas
- Los ejecutores ejecutan tareas y almacenan datos en caché
- Los administradores de clúster (Standalone, YARN, K8s) asignan recursos
- La localidad de los datos minimiza la sobrecarga de red
- El recuento de particiones determina el nivel de paralelismo
- Elegir el administrador de clúster adecuado depende de su infraestructura
Preguntas de Práctica
- ¿Cuáles son los tres componentes principales de una aplicación Spark?
- ¿Qué sucede si el proceso driver falla?
- ¿Por qué debería limitar el recuento de núcleos del ejecutor a 3-5?
- ¿Cuál es la diferencia entre los modos de implementación
yarn-clientyyarn-cluster? - ¿Cuándo elegiría Kubernetes sobre YARN para Spark?
- Explique los cinco niveles de localidad que Spark usa para la programación de tareas.
- ¿Cómo determina Spark el número de particiones al leer de HDFS?
- ¿Cuál es el rol del administrador de clúster durante el ciclo de vida de una aplicación Spark?
- ¿Por qué es útil la asignación dinámica en un clúster multi-inquilino?
- ¿Qué parámetros de configuración controlan los recursos del ejecutor?