Sử dụng tia lửa 2.4.4 chạy trong chế độ cụm YARN với bộ lập lịch biểu đồ tia sáng FIFO.
Tôi đang gửi nhiều hoạt động cơ sở dữ liệu tia lửa (tức là ghi dữ liệu lên S3) bằng cách sử dụng bộ thực thi nhóm luồng với số lượng luồng khác nhau. Điều này hoạt động tốt nếu tôi có ~ 10 luồng, nhưng nếu tôi sử dụng hàng trăm luồng, dường như có một bế tắc, không có công việc nào được lên lịch theo Spark UI.
Những yếu tố kiểm soát bao nhiêu công việc có thể được lên lịch đồng thời? Tài nguyên trình điều khiển (ví dụ bộ nhớ / lõi)? Một số cài đặt cấu hình tia lửa khác?
BIÊN TẬP:
Đây là một bản tóm tắt ngắn gọn về mã của tôi
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();
Tại một số điểm, khi nThreads
tăng, tia lửa dường như không còn lên lịch cho bất kỳ công việc nào như được chứng minh bằng:
ecs.poll(...)
hết thời gian- Tab công việc Spark UI hiển thị không có công việc đang hoạt động
- Tab người thực thi Spark UI hiển thị không có tác vụ nào cho bất kỳ người thực thi nào
- Tab Spark UI SQL hiển thị
nThreads
các truy vấn đang chạy mà không có ID công việc đang chạy
Môi trường thực thi của tôi là
- AWS EMR 5.28.1
- Tia lửa 2.4.4
- Nút chủ =
m5.4xlarge
- Các nút lõi = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
để lấy kết xuất luồng với thông tin khóa.