Memecahkan masalah error VM kehabisan memori

Halaman ini memberikan informasi tentang error kehabisan memori (OOM) Dataproc di VM Compute Engine, dan menjelaskan langkah-langkah yang dapat Anda lakukan untuk memecahkan masalah dan menyelesaikan error OOM.

Efek error OOM

Saat VM Dataproc di Compute Engine 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 Dataproc.

Kontrol memori YARN

Apache YARN menyediakan jenis kontrol memori berikut:

  • Berbasis polling (lama)
  • Ketat
  • Elastic

Secara default, Dataproc tidak menetapkan yarn.nodemanager.resource.memory.enabled untuk mengaktifkan kontrol memori YARN, karena alasan berikut:

  • Kontrol memori yang ketat dapat menyebabkan penghentian penampung saat ada memori yang cukup jika ukuran penampung 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 Dataproc

Jika VM cluster Dataproc mengalami tekanan memori, perlindungan memori Dataproc akan menghentikan proses atau container hingga kondisi OOM dihilangkan.

Dataproc menyediakan perlindungan memori untuk node cluster berikut dalam versi image Dataproc di Compute Engine berikut:

Peran 1,5 2.0 2.1 2.2
Master VM 1.5.74+ 2.0.48+ semua semua
Worker VM Tidak Tersedia 2.0.76+ 2.1.24+ semua
Driver Pool VM 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 Dataproc akan keluar dengan kode 137 atau 143.

  • Jika Dataproc menghentikan proses karena tekanan memori, tindakan atau kondisi berikut dapat terjadi:

    • Dataproc akan menaikkan metrik kumulatif dataproc.googleapis.com/node/problem_count, dan menetapkan reason ke ProcessKilledDueToMemoryPressure. Lihat Pengumpulan metrik resource Dataproc.
    • Dataproc menulis log google.dataproc.oom-killer dengan 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:"
      

Penghentian tugas node master atau node driver pool

  • Jika tugas node master Dataproc atau node pool driver 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-killer atau dataproc.googleapis.com/node/problem_count untuk mengonfirmasi bahwa Perlindungan Memori Dataproc menghentikan tugas (lihat Penghentian proses).

    Solusi:

    • Jika cluster memiliki driver pool, tingkatkan driver-required-memory-mb ke 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.

Penghentian container YARN node pekerja

  • Dataproc 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 log google.dataproc.oom-killer atau dataproc.googleapis.com/node/problem_count untuk mengonfirmasi bahwa Perlindungan Memori Dataproc 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 kemiringan data menyebabkan peningkatan penggunaan container tertentu. Jika demikian, partisi ulang tugas atau tambah ukuran pekerja untuk mengakomodasi persyaratan memori tambahan.