OutOfMemoryError บนไดรเวอร์ของ Spark - ฮีปดัมพ์ 1Gb ในขณะที่กำหนดค่า 10Gb

ฉันมี OutOfMemoryError ที่ทำซ้ำได้ 100% (ส่วนใหญ่มักเกิดจากการเกินขีดจำกัดค่าโสหุ้ย GC) เมื่อเรียกใช้แอปพลิเคชัน Spark ซึ่งเกิดขึ้นประมาณช่วงที่ 700

เนื่องจากกลุ่มข้อผิดพลาดมีคลาสต่างๆ เช่น .ui., TaskSchedulerImpl ฯลฯ อยู่เสมอ ฉันจึงสรุปว่าปัญหาไม่ได้อยู่ที่ตัวดำเนินการ แต่อยู่ที่กระบวนการของไดรเวอร์ เอง ข้อสรุปนี้ได้รับการสำรองข้อมูลโดยการสังเกตต่อไปนี้: นาทีก่อน OOM เอาต์พุต stdout จะเริ่มหยุดชั่วคราวประมาณหนึ่งวินาที หรือประมาณนั้น โดยพิมพ์หลายบรรทัดชั่วครู่ทันทีหลังจากการหยุดชั่วคราว

spark.driver.memory ได้รับการกำหนดค่าให้เป็น 10G แต่เครื่องมือแก้ไขข้อบกพร่องที่ใช้แสดงว่าไดรเวอร์ใช้เพียง 1Gb เท่านั้น:

  1. 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อย่างดีที่สุด
  2. 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 บนไดรเวอร์ของฉันได้อย่างไร


person Matvey Zhuravel    schedule 14.08.2019    source แหล่งที่มา


คำตอบ (1)


ปัญหาที่แท้จริงคือกระบวนการไดรเวอร์ใช้หน่วยความจำเพียง 1Gb แม้ว่าจะมีการตั้งค่า spark.driver.memory=10G ก็ตาม

ตามเอกสารประกอบ: ในโหมดไคลเอนต์ การกำหนดค่านี้< /strong> (spark.driver.memory) ต้องไม่ตั้งค่าผ่าน SparkConf โดยตรงในแอปพลิเคชันของคุณ เนื่องจากไดรเวอร์ JVM ได้เริ่มทำงานที่จุดนั้นแล้ว โปรดตั้งค่านี้ผ่านตัวเลือกบรรทัดคำสั่ง --driver-memory หรือในไฟล์คุณสมบัติเริ่มต้นของคุณแทน

ฉันใช้โหมดไคลเอนต์ การย้ายการตั้งค่าจากพารามิเตอร์บริบท Spark ไปยังพารามิเตอร์บรรทัดคำสั่ง spark-submit ช่วยแก้ปัญหาได้

ป.ล. "หากไม่มีสิ่งใดทำงานตามที่คาดไว้ โปรดอ่านคู่มือ" (c)

person Matvey Zhuravel    schedule 16.08.2019