本頁提供 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 記憶體保護機制終止的程序會以
137
或143
程式碼結束。如果 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 會遞增
主要節點或驅動程式節點集區工作終止
如果 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 記憶體保護機制已終止作業 (請參閱「程序終止」)。
解決方法:
- 檢查
工作站節點 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 容器的記憶體量。 - 如果工作容器持續失敗,請檢查資料偏斜是否導致特定容器的使用量增加。如果是,請重新分割工作或增加工作站大小,以因應額外的記憶體需求。