本页介绍了 Compute Engine 虚拟机上 Dataproc 的内存不足 (OOM) 错误,并说明了您可以采取哪些步骤来排查和解决 OOM 错误。
OOM 错误的影响
当 Dataproc on Compute Engine 虚拟机遇到内存不足 (OOM) 错误时,会产生以下影响:
主虚拟机和工作器虚拟机会冻结一段时间。
主虚拟机 OOM 错误会导致作业失败并出现“未获取任务”错误。
工作器虚拟机 OOM 错误会导致 YARN HDFS 上节点丢失,从而延迟 Dataproc 作业执行。
YARN 内存控件
Apache YARN 提供以下类型的内存控制:
- 基于轮询(旧版)
- 严格
- Elastic
默认情况下,Dataproc 不会设置 yarn.nodemanager.resource.memory.enabled
以启用 YARN 内存控制,原因如下:
- 如果容器大小配置不正确,严格的内存控制可能会导致在有足够内存的情况下终止容器。
- 弹性内存控制要求可能会对作业执行产生不利影响。
- 当进程大量消耗内存时,YARN 内存控制功能可能会无法防止 OOM 错误。
Dataproc 内存保护
当 Dataproc 集群虚拟机面临内存压力时,Dataproc 内存保护功能会终止进程或容器,直到内存不足 (OOM) 情况消除。
Dataproc 在以下 Dataproc on Compute Engine 映像版本中为以下集群节点提供内存保护:
角色 | 1.5 | 2.0 | 2.1 | 2.2 |
---|---|---|---|---|
主虚拟机 | 1.5.74+ | 2.0.48+ | 全部 | 全部 |
工作器虚拟机 | 不可用 | 2.0.76+ | 2.1.24+ | 全部 |
驱动程序池虚拟机 | 不可用 | 2.0.76+ | 2.1.24+ | 全部 |
识别和确认内存保护终止
您可以使用以下信息来识别和确认因内存压力而导致的作业终止。
进程终止
Dataproc 内存保护终止的进程会以代码
137
或143
退出。当 Dataproc 因内存压力而终止进程时,可能会发生以下操作或情况:
- Dataproc 会递增
dataproc.googleapis.com/node/problem_count
累计指标,并将reason
设置为ProcessKilledDueToMemoryPressure
。请参阅 Dataproc 资源指标收集。 - Dataproc 会写入一条消息为
"A process is killed due to memory pressure: process name
的google.dataproc.oom-killer
日志。如需查看这些消息,请启用 Logging,然后使用以下日志过滤条件: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
。如需查看这些消息,请启用 Logging,然后使用以下日志过滤条件: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 内存保护功能是否终止了作业(请参阅进程终止)。解决方案:
- 检查容器大小是否配置正确。
- 考虑降低
yarn.nodemanager.resource.memory-mb
。此属性用于控制用于调度 YARN 容器的内存量。 - 如果作业容器一直失败,请检查数据倾斜是否导致特定容器的使用量增加。如果是,请重新划分作业或增加工作器大小,以满足额外的内存要求。