Memecahkan masalah error VM kehabisan memori

Halaman ini memberikan informasi tentang error out-of-memory (OOM) Managed Service untuk Apache Spark di VM Compute Engine, dan menjelaskan langkah-langkah yang dapat Anda lakukan untuk memecahkan masalah dan mengatasi error OOM.

Efek error OOM

Jika VM Managed Service untuk Apache Spark mengalami error out-of-memory (OOM), efeknya mencakup kondisi berikut:

  • VM master dan pekerja berhenti berfungsi untuk 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 untuk Apache Spark.

Kontrol memori YARN

Apache YARN menyediakan jenis kontrol memoriberikut:

  • 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 ketat dapat menyebabkan penghentian container saat ada memori yang cukup jika ukuran container tidak dikonfigurasi dengan benar.
  • Persyaratan kontrol memori elastic 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

Saat 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 dihapus.

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 Kumpulan Driver 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.

Penghentian proses

  • Proses yang dihentikan oleh perlindungan memori Managed Service untuk Apache Spark akan keluar dengan kode 137 atau 143.

  • Saat Managed Service untuk Apache Spark menghentikan proses karena tekanan memori, tindakan atau kondisi berikut dapat terjadi:

    • Managed Service untuk Apache Spark meningkatkan metrik kumulatif dataproc.googleapis.com/node/problem_count, dan menetapkan reason ke ProcessKilledDueToMemoryPressure. Lihat Pengumpulan metrik resource Managed Service untuk Apache Spark.
    • Managed Service untuk Apache Spark 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 kumpulan node driver

  • Saat tugas node master atau kumpulan node driver Managed Service untuk Apache Spark dihentikan karena tekanan memori, tugas akan gagal dengan error Driver received SIGTERM/SIGKILL signal and exited with INT 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:"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 Managed Service untuk Apache Spark menghentikan tugas (lihat Penghentian proses).

    Solusi:

    • Jika cluster memiliki a kumpulan driver, tingkatkan driver-required-memory-mb ke penggunaan memori tugas yang sebenarnya.
    • Jika cluster tidak memiliki kumpulan driver, buat ulang cluster, dengan menurunkan jumlah maksimum tugas serentak yang berjalan di cluster.
    • Gunakan jenis mesin node master dengan memori yang ditingkatkan.

Penghentian container YARN node pekerja

  • 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 container keluar dengan code INT, periksa log google.dataproc.oom-killer atau dataproc.googleapis.com/node/problem_count untuk mengonfirmasi bahwa Perlindungan Memori Managed Service untuk Apache Spark menghentikan tugas (lihat Penghentian proses).

    Solusi:

    • Pastikan ukuran container 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 data skew menyebabkan peningkatan penggunaan container tertentu. Jika ya, buat ulang partisi 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 berhenti berfungsi dengan mengosongkan memori saat memori yang tersedia sangat rendah. Konfigurasi default cocok untuk banyak workload. Namun, Anda mungkin perlu menyesuaikan konfigurasi jika node master memiliki memori yang besar dan mengalami konsumsi memori yang cepat.

Dalam skenario dengan tekanan memori 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 default-nya 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 lebih banyak memori, mengurangi konkurensi tugas, atau mengoptimalkan penggunaan memori tugas.

Menyesuaikan setelan earlyoom

Konfigurasi earlyoom default menggunakan jumlah memori kosong yang tetap sebagai pemicu. Di virtual machine dengan RAM yang 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.

  1. Hubungkan ke node master menggunakan SSH.

  2. Buka file konfigurasi untuk mengedit:

    sudo nano /etc/default/earlyoom
    
  3. Sesuaikan nilai minimum memori. Temukan baris EARLYOOM_ARGS. Opsi -M <kbytes> menetapkan jumlah minimum memori kosong dalam KiB yang coba dipertahankan oleh earlyoom. Nilai default-nya adalah -M 65536, yaitu 64 MiB.

    Untuk node master dengan memori yang besar, tingkatkan nilai ini. Misalnya, untuk menetapkan nilai minimum ke 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 memicu earlyoom
  4. Mulai ulang layanan earlyoom untuk menerapkan perubahan:

    sudo systemctl restart earlyoom