Utilisation de spark 2.4.4 fonctionnant en mode cluster YARN avec le planificateur spark FIFO.
Je soumets plusieurs opérations de trame de données spark (c'est-à-dire l'écriture de données dans S3) à l'aide d'un exécuteur de pool de threads avec un nombre variable de threads. Cela fonctionne très bien si j'ai ~ 10 threads, mais si j'utilise des centaines de threads, il semble y avoir un blocage, aucun travail n'étant planifié selon l'interface utilisateur Spark.
Quels facteurs contrôlent le nombre de travaux pouvant être planifiés simultanément? Ressources du pilote (par exemple mémoire / cœurs)? D'autres paramètres de configuration d'allumage?
ÉDITER:
Voici un bref synopsis de mon code
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();
À un moment donné, au fur et à nThreads
mesure que l' augmentation augmente, spark ne semble plus planifier de travaux, comme en témoignent:
ecs.poll(...)
expirer finalement- L'onglet Spark UI jobs ne montrant aucun travail actif
- L'onglet Spark UI executors ne montrant aucune tâche active pour aucun exécuteur
- L'onglet SQL Spark UI affichant
nThreads
les requêtes en cours d'exécution sans ID de travail en cours d'exécution
Mon environnement d'exécution est
- AWS EMR 5.28.1
- Spark 2.4.4
- Noeud maître =
m5.4xlarge
- Nœuds principaux = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
pour obtenir un vidage de thread avec des informations de verrouillage.