การใช้ spark 2.4.4 ทำงานในโหมดคลัสเตอร์ YARN พร้อมด้วยตัวกำหนดตารางเวลาประกายไฟ FIFO
ฉันกำลังส่งการดำเนินการ spark dataframe หลายรายการ (เช่นการเขียนข้อมูลไปยัง S3) โดยใช้ตัวจัดการเธรดพูลที่มีเธรดจำนวนตัวแปร สิ่งนี้ใช้ได้ดีถ้าฉันมีเธรด ~ 10 แต่ถ้าฉันใช้เธรดนับร้อยรายการดูเหมือนว่าจะเป็นการหยุดชะงักโดยไม่มีงานที่กำหนดไว้ตาม Spark UI
ปัจจัยอะไรที่ควบคุมว่าสามารถจัดตารางเวลางานได้พร้อมกันกี่งาน ทรัพยากรไดร์เวอร์ (เช่นหน่วยความจำ / แกนประมวลผล)? การตั้งค่าการกำหนดค่า Spark อื่น ๆ
แก้ไข:
นี่เป็นบทสรุปโดยย่อของรหัสของฉัน
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();
เมื่อถึงจุดหนึ่งเมื่อมีการnThreads
เพิ่มจำนวนขึ้นประกายไฟก็ดูเหมือนว่าจะไม่ได้กำหนดเวลางานใด ๆ ตามที่ได้รับการพิสูจน์โดย:
ecs.poll(...)
หมดเวลาในที่สุด- แท็บงาน Spark UI แสดงไม่มีงานที่ใช้งานอยู่
- แท็บตัวจัดการ Spark UI แสดงงานที่ไม่ทำงานสำหรับผู้ปฏิบัติการใด ๆ
- แท็บ Spark UI SQL แสดงคิวรีที่
nThreads
กำลังรันโดยไม่มี ID งานที่รันอยู่
สภาพแวดล้อมการดำเนินการของฉันคือ
- AWS EMR 5.28.1
- Spark 2.4.4
- โหนดหลัก =
m5.4xlarge
- โหนดหลัก = 3x
rd5.24xlarge
spark.driver.cores=24
spark.driver.memory=32g
spark.executor.memory=21g
spark.scheduler.mode=FIFO
jstack -l
เพื่อรับเธรดการถ่ายโอนข้อมูลพร้อมข้อมูลล็อค