ฉันมี OutOfMemoryError
ที่ทำซ้ำได้ 100% (ส่วนใหญ่มักเกิดจากการเกินขีดจำกัดค่าโสหุ้ย GC) เมื่อเรียกใช้แอปพลิเคชัน Spark ซึ่งเกิดขึ้นประมาณช่วงที่ 700
เนื่องจากกลุ่มข้อผิดพลาดมีคลาสต่างๆ เช่น .ui.
, TaskSchedulerImpl
ฯลฯ อยู่เสมอ ฉันจึงสรุปว่าปัญหาไม่ได้อยู่ที่ตัวดำเนินการ แต่อยู่ที่กระบวนการของไดรเวอร์ เอง ข้อสรุปนี้ได้รับการสำรองข้อมูลโดยการสังเกตต่อไปนี้: นาทีก่อน OOM เอาต์พุต stdout
จะเริ่มหยุดชั่วคราวประมาณหนึ่งวินาที หรือประมาณนั้น โดยพิมพ์หลายบรรทัดชั่วครู่ทันทีหลังจากการหยุดชั่วคราว
spark.driver.memory
ได้รับการกำหนดค่าให้เป็น 10G แต่เครื่องมือแก้ไขข้อบกพร่องที่ใช้แสดงว่าไดรเวอร์ใช้เพียง 1Gb เท่านั้น:
- I've used these great instructions on collecting GC statistics and analyzing it with the gceasy.io service; it clearly showed that:
- The maximum heap usage after GC is approximately 1Gb.
- เมื่อใกล้กับช่วงเวลาของ OOM กราฟ 'การใช้งานฮีป' เกือบจะแตะระดับสูงสุดที่ 1Gb และเหตุการณ์ GC จำนวนมากก็ไม่ส่งผลกระทบต่อสิ่งนั้น
GC overhead limit exceeded
อย่างดีที่สุด
- I've used the MAT to analyse the heap dump created immediately after the OutOfMemoryError.
- The heap dump contains approximately the same 1Gb of data.
- ต้นไม้ Dominator แสดงให้เห็นว่ามากกว่าครึ่งหนึ่งถูกใช้โดยออบเจ็กต์ UI
คำถามนี้ คำตอบ แนะนำว่าไลบรารี JNI อาจใช้ 10Gb-1Gb=9Gb ได้ แต่เห็นได้ชัดว่า Spark ไม่ได้ใช้สิ่งนั้นที่เป็นแกนกลางของมัน ฉันก็ไม่เหมือนกัน.
ฉันใช้คำตอบของคำถามนี้เพื่อลดข้อมูล UI ที่เก็บไว้ เป็นผลให้แอปพลิเคชันของฉันทำงานได้สำเร็จ แต่ฉันยังไม่พร้อมที่จะแยกส่วนกับข้อมูลการแก้ไขข้อบกพร่องอันมีค่าทั้งหมดที่สามารถสำรวจได้โดยใช้ Spark UI
นอกจากนี้ ฉันไม่พบคำอธิบายใดๆ เกี่ยวกับรุ่นหน่วยความจำไดรเวอร์ของ Spark
คำถามคือ: ฉันจะเก็บรักษาข้อมูลการแก้ไขจุดบกพร่อง UI ไว้และไม่พบกับ OOM บนไดรเวอร์ของฉันได้อย่างไร