Halaman ini memberikan informasi tentang error kehabisan memori (OOM) Managed Service untuk Apache Spark di VM Compute Engine, dan menjelaskan langkah-langkah yang dapat Anda lakukan untuk memecahkan masalah dan menyelesaikan error OOM.
Efek error OOM
Saat VM Managed Service untuk Apache Spark mengalami error kehabisan memori (OOM), efeknya mencakup kondisi berikut:
VM master dan pekerja berhenti berfungsi selama jangka waktu tertentu.
Error OOM VM Master menyebabkan tugas gagal dengan error "task not acquired".
Error OOM VM pekerja menyebabkan hilangnya node di YARN HDFS, yang menunda eksekusi tugas Managed Service for Apache Spark.
Kontrol memori YARN
Apache YARN menyediakan jenis kontrol memori berikut:
- Berbasis polling (lama)
- Ketat
- Elastic
Secara default, Managed Service untuk Apache Spark tidak menetapkan
yarn.nodemanager.resource.memory.enabled untuk mengaktifkan kontrol memori YARN, karena
alasan berikut:
- Kontrol memori yang ketat dapat menyebabkan penghentian container saat ada memori yang cukup jika ukuran container tidak dikonfigurasi dengan benar.
- Persyaratan kontrol memori elastis dapat memengaruhi eksekusi tugas secara negatif.
- Kontrol memori YARN dapat gagal mencegah error OOM saat proses menggunakan memori secara agresif.
Perlindungan memori Managed Service untuk Apache Spark
Jika VM cluster Managed Service untuk Apache Spark mengalami tekanan memori, perlindungan memori Managed Service untuk Apache Spark akan menghentikan proses atau container hingga kondisi OOM dihilangkan.
Managed Service untuk Apache Spark menyediakan perlindungan memori untuk node cluster berikut dalam versi image Managed Service untuk Apache Spark berikut:
| Peran | 1,5 | 2.0 | 2.1 | 2.2 |
|---|---|---|---|---|
| VM Master | 1.5.74+ | 2.0.48+ | semua | semua |
| VM Pekerja | Tidak Tersedia | 2.0.76+ | 2.1.24+ | semua |
| VM Driver Pool | Tidak Tersedia | 2.0.76+ | 2.1.24+ | semua |
Mengidentifikasi dan mengonfirmasi penghentian perlindungan memori
Anda dapat menggunakan informasi berikut untuk mengidentifikasi dan mengonfirmasi penghentian tugas karena tekanan memori.
Proses penghentian
Proses yang dihentikan oleh perlindungan memori Managed Service untuk Apache Spark keluar dengan kode
137atau143.Jika Managed Service untuk Apache Spark menghentikan proses karena tekanan memori, tindakan atau kondisi berikut dapat terjadi:
- Managed Service untuk Apache Spark akan menaikkan metrik kumulatif
dataproc.googleapis.com/node/problem_count, dan menetapkanreasonkeProcessKilledDueToMemoryPressure. Lihat pengumpulan metrik resource Managed Service untuk Apache Spark. - Managed Service untuk Apache Spark menulis log
google.dataproc.oom-killerdengan pesan:"A process is killed due to memory pressure: process name. Untuk melihat pesan ini, aktifkan Logging, lalu gunakan filter log berikut:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"A process is killed due to memory pressure:"
- Managed Service untuk Apache Spark akan menaikkan metrik kumulatif
Penghentian tugas node pool master atau node driver
Jika tugas kumpulan driver atau node master Managed Service untuk Apache Spark berakhir karena tekanan memori, tugas akan gagal dengan kode error
Driver received SIGTERM/SIGKILL signal and exited with INT. Untuk melihat pesan ini, aktifkan Logging, lalu gunakan filter log berikut:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"Driver received SIGTERM/SIGKILL signal and exited with"- Periksa log
google.dataproc.oom-killerataudataproc.googleapis.com/node/problem_countuntuk mengonfirmasi bahwa Managed Service untuk Apache Spark Memory Protection menghentikan tugas (lihat Penghentian proses).
Solusi:
- Jika cluster memiliki
driver pool,
tingkatkan
driver-required-memory-mbke penggunaan memori tugas sebenarnya. - Jika cluster tidak memiliki kumpulan driver, buat ulang cluster dengan mengurangi jumlah maksimum tugas serentak yang berjalan di cluster.
- Gunakan jenis mesin node master dengan memori yang ditingkatkan.
- Periksa log
Penghentian container YARN worker node
Managed Service untuk Apache Spark menulis pesan berikut di pengelola resource YARN:
container id exited with code EXIT_CODE. Untuk melihat pesan ini, aktifkan Logging, lalu gunakan filter log berikut:resource.type="cloud_dataproc_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.cluster_uuid="CLUSTER_UUID" jsonPayload.message:"container" AND "exited with code" AND "which potentially signifies memory pressure on NODE
Jika penampung keluar dengan
code INT, periksa loggoogle.dataproc.oom-killerataudataproc.googleapis.com/node/problem_countuntuk mengonfirmasi bahwa Managed Service untuk Apache Spark Memory Protection menghentikan tugas (lihat Penghentian proses).Solusi:
- Pastikan ukuran penampung dikonfigurasi dengan benar.
- Pertimbangkan untuk menurunkan
yarn.nodemanager.resource.memory-mb. Properti ini mengontrol jumlah memori yang digunakan untuk menjadwalkan container YARN. - Jika container tugas terus gagal, periksa apakah kecondongan data menyebabkan peningkatan penggunaan container tertentu. Jika demikian, partisi ulang tugas atau tingkatkan ukuran pekerja untuk mengakomodasi persyaratan memori tambahan.
Menyesuaikan perlindungan memori Linux di node master (lanjutan)
Node master Managed Service untuk Apache Spark menggunakan utilitas earlyoom untuk mencegah sistem macet dengan
mengosongkan memori saat memori yang tersedia sangat rendah. Konfigurasi default cocok untuk banyak beban kerja. Namun, Anda mungkin perlu menyesuaikan
konfigurasi jika node master Anda memiliki memori dalam jumlah besar dan mengalami
penggunaan memori yang cepat.
Dalam skenario dengan tekanan memori yang tinggi, sistem dapat memasuki status
"thrashing", yang menghabiskan sebagian besar waktunya untuk pengelolaan memori dan menjadi
tidak responsif. Hal ini dapat terjadi begitu cepat sehingga earlyoom gagal mengambil tindakan berdasarkan
setelan defaultnya atau gagal bertindak sebelum respons OOM kernel dipanggil.
Sebelum memulai
- Ini adalah opsi penyesuaian lanjutan. Sebelum menyesuaikan setelan
earlyoom, prioritaskan solusi lain, seperti menggunakan VM master dengan memori yang lebih besar, mengurangi konkurensi tugas, atau mengoptimalkan penggunaan memori tugas.
Menyesuaikan setelan earlyoom
Konfigurasi earlyoom default menggunakan jumlah memori kosong yang tetap sebagai pemicu. Pada virtual machine dengan RAM berkapasitas besar, misalnya 32GB atau lebih, jumlah tetap ini mungkin mewakili sebagian kecil dari total memori.
Hal ini membuat sistem rentan terhadap lonjakan penggunaan memori yang tiba-tiba.
Untuk menyesuaikan setelan earlyoom, hubungkan ke node master dan ubah file konfigurasi.
Buka file konfigurasi untuk mengedit:
sudo nano /etc/default/earlyoomSesuaikan batas memori minimum. Cari baris
EARLYOOM_ARGS. Opsi-M <kbytes>menetapkan jumlah minimum memori kosong dalam KiB yangearlyoomcoba dipertahankan. Nilai defaultnya adalah-M 65536, yaitu64 MiB.Untuk node master dengan memori yang besar, tingkatkan nilai ini. Misalnya, untuk menetapkan nilai minimum menjadi
1 GiB(1048576 KiB), ubah baris sebagai berikut:EARLYOOM_ARGS="-r 15 -M 1048576 -s 1"Catatan:
-r: Interval laporan memori dalam detik-s: Nilai minimum ruang swap untuk memicuearlyoom
Mulai ulang layanan
earlyoomuntuk menerapkan perubahan:sudo systemctl restart earlyoom