Verwenden von spark 2.4.4 im YARN-Cluster-Modus mit dem Spark-FIFO-Scheduler.
Ich sende mehrere Spark-Datenrahmenoperationen (dh das Schreiben von Daten in S3) mit einem Thread-Pool-Executor mit einer variablen Anzahl von Threads. Dies funktioniert gut, wenn ich ~ 10 Threads habe, aber wenn ich Hunderte von Threads verwende, scheint es einen Deadlock zu geben, da keine Jobs gemäß der Spark-Benutzeroberfläche geplant sind.
Welche Faktoren steuern, wie viele Jobs gleichzeitig geplant werden können? Treiberressourcen (zB Speicher / Kerne)? Einige andere Einstellungen für die Funkenkonfiguration?
BEARBEITEN:
Hier ist eine kurze Zusammenfassung meines Codes
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();
Irgendwann, wenn der nThreads
Anstieg zunimmt, scheint Spark keine Jobs mehr zu planen, wie gezeigt wird durch:
ecs.poll(...)
Zeitüberschreitung irgendwann- Auf der Registerkarte Spark UI-Jobs werden keine aktiven Jobs angezeigt
- Auf der Registerkarte "Executoren der Spark-Benutzeroberfläche" werden keine aktiven Aufgaben für einen Executor angezeigt
- Die Registerkarte Spark UI SQL zeigt
nThreads
laufende Abfragen ohne laufende Job-IDs an
Meine Ausführungsumgebung ist
- AWS EMR 5.28.1
- Funke 2.4.4
- Hauptknoten =
m5.4xlarge
- Kernknoten = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
in beiden Fällen einen Thread-Dump mit Sperrinformationen aus.