排解 VM 記憶體不足錯誤

本頁提供 Dataproc on Compute Engine VM 記憶體不足 (OOM) 錯誤的相關資訊,並說明如何排解及解決 OOM 錯誤。

OOM 錯誤的影響

當 Compute Engine VM 上的 Dataproc 發生記憶體不足 (OOM) 錯誤時,會出現下列情況:

  • 主要和工作站 VM 會凍結一段時間。

  • 如果主機 VM 發生 OOM 錯誤,工作就會失敗,並顯示「task not acquired」(未取得工作) 錯誤。

  • 工作站 VM 發生 OOM 錯誤會導致 YARN HDFS 上的節點遺失,進而延遲 Dataproc 工作執行。

YARN 記憶體控制項

Apache YARN 提供下列類型的記憶體控制項

  • 輪詢式 (舊版)
  • 嚴格
  • Elastic

根據預設,Dataproc 不會設定 yarn.nodemanager.resource.memory.enabled 來啟用 YARN 記憶體控制項,原因如下:

  • 如果容器大小設定不正確,嚴格的記憶體控制可能會導致容器在記憶體充足時終止。
  • 彈性記憶體控制項需求可能會對工作執行造成負面影響。
  • 如果程序大量耗用記憶體,YARN 記憶體控制項可能無法避免 OOM 錯誤。

Dataproc 記憶體保護機制

如果 Dataproc 叢集 VM 的記憶體不足,Dataproc 記憶體保護機制會終止程序或容器,直到記憶體不足的狀況解除為止。

Dataproc 會為下列叢集節點提供記憶體保護機制,適用於下列Dataproc on Compute Engine 映像檔版本

角色 1.5 2.0 2.1 2.2
主機 VM 1.5.74+ 2.0.48+ 全部 全部
工作站 VM 無法使用 2.0.76+ 2.1.24+ 全部
Driver Pool VM 無法使用 2.0.76+ 2.1.24+ 全部

找出並確認記憶體保護終止作業

您可以根據下列資訊,找出並確認因記憶體壓力而終止的工作。

處理終止

  • Dataproc 記憶體保護機制終止的程序會以 137143 程式碼結束。

  • 如果 Dataproc 因記憶體壓力而終止程序,可能會發生下列動作或情況:

    • Dataproc 會遞增 dataproc.googleapis.com/node/problem_count 累計指標,並將 reason 設為 ProcessKilledDueToMemoryPressure。請參閱「Dataproc 資源指標收集」。
    • Dataproc 會寫入 google.dataproc.oom-killer 記錄檔,並顯示以下訊息: "A process is killed due to memory pressure: process name。 如要查看這些訊息,請啟用記錄功能,然後使用下列記錄篩選器:
      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:"
      

主要節點或驅動程式節點集區工作終止

  • 如果 Dataproc 主節點或驅動程式節點集區工作因記憶體壓力而終止,工作會失敗並顯示 Driver received SIGTERM/SIGKILL signal and exited with INT 錯誤碼。如要查看這些訊息,請啟用記錄功能,然後使用下列記錄篩選器:

    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"
        

    • 檢查 google.dataproc.oom-killer 記錄檔或 dataproc.googleapis.com/node/problem_count,確認 Dataproc 記憶體保護機制已終止作業 (請參閱「程序終止」)。

    解決方法:

    • 如果叢集有驅動程式集區,請將 driver-required-memory-mb 增加至實際工作記憶體用量。
    • 如果叢集沒有驅動程式集區,請重新建立叢集,並降低叢集執行的並行工作數上限
    • 使用記憶體增加的主要節點機器類型。

工作站節點 YARN 容器終止

  • Dataproc 會在 YARN 資源管理員中寫入以下訊息:container id exited with code EXIT_CODE。如要查看這些訊息,請啟用「記錄」,然後使用下列記錄篩選器:

    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
    
  • 如果容器以 code INT 結束,請檢查 google.dataproc.oom-killer 記錄或 dataproc.googleapis.com/node/problem_count,確認 Dataproc Memory Protection 已終止工作 (請參閱「程序終止」)。

    解決方法:

    • 確認容器大小設定正確無誤。
    • 建議調低 yarn.nodemanager.resource.memory-mb。這項屬性會控管用於排定 YARN 容器的記憶體量。
    • 如果工作容器持續失敗,請檢查資料偏斜是否導致特定容器的使用量增加。如果是,請重新分割工作或增加工作站大小,以因應額外的記憶體需求。