Uso de spark 2.4.4 que se ejecuta en modo de clúster YARN con el programador FIFO de spark.
Estoy enviando múltiples operaciones de trama de datos de chispa (es decir, escribiendo datos en S3) usando un ejecutor de grupo de subprocesos con un número variable de subprocesos. Esto funciona bien si tengo ~ 10 hilos, pero si uso cientos de hilos, parece que hay un punto muerto, sin trabajos programados de acuerdo con la interfaz de usuario de Spark.
¿Qué factores controlan cuántos trabajos se pueden programar simultáneamente? ¿Recursos del controlador (por ejemplo, memoria / núcleos)? ¿Alguna otra configuración de chispa?
EDITAR:
Aquí hay una breve sinopsis de mi código
ExecutorService pool = Executors.newFixedThreadPool(nThreads);
ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool);
Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths);
List<Future<Void>> futures = listOfSeveralHundredThings
.stream()
.map(aThing -> ecs.submit(() -> {
df
.filter(col("some_column").equalTo(aThing))
.write()
.format("org.apache.hudi")
.options(writeOptions)
.save(outputPathFor(aThing));
return null;
}))
.collect(Collectors.toList());
IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES));
exec.shutdownNow();
En algún momento, a medida que nThreads
aumenta, la chispa ya no parece estar programando ningún trabajo como lo demuestra:
ecs.poll(...)
tiempo de espera eventualmente- La pestaña de trabajos de Spark UI que no muestra trabajos activos
- La pestaña Ejecutores de Spark UI que no muestra tareas activas para ningún ejecutor
- La pestaña Spark UI SQL que muestra
nThreads
consultas en ejecución sin ID de trabajo en ejecución
Mi entorno de ejecución es
- AWS EMR 5.28.1
- Spark 2.4.4
- Nodo maestro =
m5.4xlarge
- Nodos centrales = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
para obtener un volcado de subprocesos con información de bloqueo.