Utilizzo di spark 2.4.4 in esecuzione in modalità cluster YARN con lo scheduler spark FIFO.
Sto inviando più operazioni di spark dataframe (cioè scrivendo dati su S3) usando un esecutore di pool di thread con un numero variabile di thread. Funziona bene se ho ~ 10 thread, ma se uso centinaia di thread, sembra che ci sia un deadlock, senza lavori pianificati secondo l'interfaccia utente di Spark.
Quali fattori controllano quanti lavori possono essere programmati contemporaneamente? Risorse del driver (ad es. Memoria / core)? Alcune altre impostazioni di configurazione della scintilla?
MODIFICARE:
Ecco una breve sinossi del mio codice
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();
Ad un certo punto, nThreads
all'aumentare, Spark non sembra più programmare alcun lavoro come evidenziato da:
ecs.poll(...)
timeout alla fine- La scheda Lavori dell'interfaccia utente Spark non mostra lavori attivi
- La scheda degli esecutori Spark dell'interfaccia utente non mostra attività attive per nessun esecutore
- La scheda SQL dell'interfaccia utente Spark che mostra le
nThreads
query in esecuzione senza ID processo in esecuzione
Il mio ambiente di esecuzione è
- AWS EMR 5.28.1
- Spark 2.4.4
- Nodo principale =
m5.4xlarge
- Nodi core = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
per ottenere un dump del thread con informazioni di blocco.