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:
- 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.
- 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?