Comprender la asignación de recursos para trabajos de chispa en mesos

Estoy trabajando en un proyecto en Spark, y recientemente cambié de usar Spark Standalone a Mesos para la gestión de clústeres. Ahora me encuentro confundido acerca de cómo asignar recursos al enviar un trabajo bajo el nuevo sistema.

En modo independiente, estaba usando algo como esto (siguiendo algunas recomendaciones deesta publicación de blog de Cloudera:

/opt/spark/bin/spark-submit --executor-memory 16G --executor-cores 8 
    --total-executor-cores 240 myscript.py

Esto está en un clúster donde cada máquina tiene 16 núcleos y ~ 32 GB de RAM.

Lo bueno de esto es que tenía un buen control sobre el número de ejecutores en ejecución y los recursos asignados a cada uno. En el ejemplo anterior, sabía que estaba obteniendo 240/8 = 30 ejecutores, cada uno con 16 GB de memoria y 8 núcleos. Dada la memoria en cada máquina en el clúster, esto equivaldría a no más de dos ejecutores ejecutándose en cada máquina. Si quisiera más ejecutores, podría hacer algo como

/opt/spark/bin/spark-submit --executor-memory 10G --executor-cores 5 
    --total-executor-cores 240 myscript.py

Esto ahora me daría 240/5 = 47 ejecutores, cada uno con 5 núcleos y 10 GB de memoria, y permitiría hasta 3 ejecutores por máquina.

Pero ahora que estoy en mesos, me estoy confundiendo un poco. En primer lugar, estoy ejecutando en modo de grano grueso para asegurarme de que puedo arreglar y controlar mi asignación de recursos (esto está al servicio de un modelo bastante complejo en el que queremos preasignar recursos).

Ahora puedo especificar--total-executor-cores y--executor-memory, pero la documentación me dice que--exeuctor-cores se aplica solo a Spark y YARN, lo que dificulta la especificación del número total de ejecutores y recursos asignados a cada uno. Digamos que corro esto:

/opt/spark/bin/spark-submit --total-executor-cores 240 --executor-memory 16G --conf spark.mesos.coarse=true myscript.py

Cuando examino este trabajo en la interfaz de usuario web de Mesos, las cosas comienzan a ser confusas. Asi que aqui están mis preguntas:

Terminología. La interfaz de usuario web enumera "marcos", que supongo que corresponden a "trabajos" en la interfaz de usuario independiente. Pero cuando hago clic en el detalle de un marco determinado, enumera "tareas". Pero estas no pueden ser tareas reales de Spark, ¿verdad? Por lo que puedo decir, "tarea" aquí en realidad debe significar "ejecutor" en lo que respecta a Spark. Esto sería coherente con la interfaz de usuario que dice que mi marco (trabajo) tiene: 15 tareas activas, 240 CPU y 264 GB de memoria.

264/15 = 17.6, lo que parece coherente con la memoria de 16 GB por ejecutor que especifiqué (más algunos gastos generales, supongo). ¿Estoy en lo cierto al interpretar todo esto?

Suponiendo que sí, cuando examino cualquiera de estas "tareas" (ejecutores) veo que cada uno tiene 16 núcleos asignados. Dado que tenemos 16 núcleos por máquina, esto parece indicar que básicamente estoy ejecutando un ejecutor en cada una de las 16 máquinas, y que cada ejecutor obtiene los 16 núcleos completos, pero solo 16 GB de RAM. (tenga en cuenta que, incluso si me caigo--executor-memory en el pasado, a algo así como 4 GB, mesos todavía solo ejecuta un ejecutor por nodo, con 16 núcleos y 4 GB de RAM). Pero lo que quiero lograr es algo así como mis dos primeros ejemplos. Es decir, quiero ejecutar múltiples ejecutores por nodo, cada uno compartiendo la RAM y los núcleos de ese nodo (es decir, un número moderado de núcleos pre ejecutor, 5-8). Considerando que no puedo especificar--executor-cores en Mesos, ¿cómo puedo lograr esto? ¿O estoy fuera de lugar por alguna razón, incluso para querer lograr esto? ¿Mesos simplemente no permitirá múltiples ejecutores por nodo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta