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, nThreadsarttı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=24spark.driver.memory=32gspark.executor.memory=21gspark.scheduler.mode=FIFO
jstack -lkilitleme bilgileri içeren bir iplik dökümü almak için lütfen çalıştırın .