Kıvılcım FIFO zamanlayıcı ile YARN küme modunda çalışan kıvılcım 2.4.4 kullanma.
Değişken sayıda iş parçacığı havuzu yürütücü kullanarak birden çok kıvılcım veri çerçevesi işlemleri (yani veri S3 yazma) gönderiyorum. ~ 10 iş parçacığım varsa bu iyi çalışır, ancak yüzlerce iş parçacığı kullanırsam, Spark UI'ye göre hiçbir iş planlanmadan bir kilitlenme var gibi görünüyor.
Aynı anda kaç işin planlanabileceğini hangi faktörler kontrol eder? Sürücü kaynakları (örneğin bellek / çekirdekler)? Diğer kıvılcım yapılandırma ayarları?
DÜZENLE:
İşte kodumun kısa bir özeti
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();
Bir noktada, nThreads
arttıkça, kıvılcım artık herhangi bir işi planladığı gibi planlamıyor gibi görünüyor:
ecs.poll(...)
sonunda zaman aşımı- Etkin iş olmadığını gösteren Spark UI işler sekmesi
- Herhangi bir yürütücü için etkin görev göstermeyen Spark UI yürütücüler sekmesi
nThreads
Çalışan iş kimliği olmayan çalışan sorguları gösteren Spark UI SQL sekmesi
Yürütme ortamım
- AWS EMR 5.28.1
- Kıvılcım 2.4.4
- Ana düğüm =
m5.4xlarge
- Çekirdek düğümler = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
kilitleme bilgileri içeren bir iplik dökümü almak için lütfen çalıştırın .