OutOfMemoryError pada driver Spark - heap dump 1Gb sementara 10Gb dikonfigurasi

Saya memiliki OutOfMemoryError yang 100% dapat direproduksi (paling sering karena batas overhead GC terlampaui) saat menjalankan aplikasi Spark saya. Itu terjadi kira-kira pada tahap ke-700.

Karena tumpukan kesalahan selalu menyertakan kelas seperti .ui., TaskSchedulerImpl, dll., saya menyimpulkan bahwa masalahnya bukan terletak pada eksekutor, namun pada proses driver itu sendiri. Kesimpulan ini didukung oleh pengamatan berikut: beberapa menit sebelum OOM, keluaran stdout mulai berhenti selama sekitar satu detik, mencetak banyak baris sesaat setelah jeda.

spark.driver.memory dikonfigurasi menjadi 10G, namun alat debugging yang digunakan menunjukkan bahwa hanya 1Gb yang digunakan oleh driver:

  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.
    • Mendekati momen OOM, grafik 'penggunaan heap' hampir menyentuh batas maksimum 1 Gb, dan berbagai peristiwa GC tidak memengaruhi hal tersebut. GC overhead limit exceeded yang terbaik.
  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.
    • Pohon Dominator menunjukkan bahwa lebih dari separuhnya digunakan oleh objek UI.

Pertanyaan ini jawaban menyarankan bahwa 10Gb-1Gb=9Gb dapat digunakan oleh perpustakaan JNI; tapi ternyata Spark tidak menggunakan itu pada intinya; aku juga tidak.

Saya telah menggunakan jawaban pertanyaan ini untuk meminimalkan data UI yang disimpan. Hasilnya, aplikasi saya berhasil dijalankan. Tetapi saya belum siap untuk berpisah dengan semua data debug berharga yang dapat dieksplorasi menggunakan Spark UI.

Selain itu, saya tidak dapat menemukan penjelasan apa pun tentang model memori driver Spark.

Pertanyaannya adalah: bagaimana cara menyimpan data debug UI dan tidak mengalami OOM pada driver saya?


person Matvey Zhuravel    schedule 14.08.2019    source sumber


Jawaban (1)


Masalah sebenarnya adalah hanya 1Gb memori yang digunakan oleh proses driver, meskipun pengaturannya spark.driver.memory=10G.

Menurut dokumentasi: dalam mode klien, konfigurasi ini< /strong> (spark.driver.memory) tidak boleh disetel melalui SparkConf langsung di aplikasi Anda, karena driver JVM sudah dimulai pada saat itu. Sebagai gantinya, atur ini melalui opsi baris perintah --driver-memory atau di file properti default Anda.

Saya menggunakan mode klien. Memindahkan pengaturan dari parameter konteks Spark ke parameter baris perintah pengiriman percikan memecahkan masalah.

P.S. “Jika tidak ada yang berjalan sesuai harapan, bacalah manualnya” (c).

person Matvey Zhuravel    schedule 16.08.2019