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, nThreadsall'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
nThreadsquery 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=24spark.driver.memory=32gspark.executor.memory=21gspark.scheduler.mode=FIFO
jstack -lper ottenere un dump del thread con informazioni di blocco.