Menggunakan percikan 2.4.4 yang berjalan dalam mode gugus BENANG dengan penjadwal FIFO percikan.
Saya mengirimkan beberapa operasi dataframe percikan (yaitu menulis data ke S3) menggunakan pelaksana kumpulan thread dengan sejumlah variabel utas. Ini berfungsi dengan baik jika saya memiliki ~ 10 utas, tetapi jika saya menggunakan ratusan utas, tampaknya ada jalan buntu, dengan tidak ada pekerjaan yang dijadwalkan menurut Spark UI.
Faktor-faktor apa yang mengontrol berapa banyak pekerjaan yang dapat dijadwalkan secara bersamaan? Sumber daya driver (mis. Memori / inti)? Beberapa pengaturan konfigurasi percikan lainnya?
EDIT:
Berikut sinopsis singkat kode saya
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();
Pada titik tertentu, seiring nThreads
kenaikan, percikan tampaknya tidak lagi menjadwalkan pekerjaan apa pun sebagaimana dibuktikan oleh:
ecs.poll(...)
akhirnya kehabisan waktu- Tab Spark UI jobs tidak menunjukkan pekerjaan aktif
- Tab pelaksana Spark UI tidak menampilkan tugas aktif untuk pelaksana apa pun
- Tab SQL UI Spark menampilkan
nThreads
permintaan menjalankan tanpa ID pekerjaan yang sedang berjalan
Lingkungan eksekusi saya adalah
- AWS EMR 5.28.1
- Percikan 2.4.4
- Master node =
m5.4xlarge
- Node inti = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
untuk mendapatkan dump thread dengan info penguncian.