OOM 影响
当 Compute Engine 虚拟机上的 Dataproc 遇到内存不足 (OOM) 错误时:
主实例和工作器虚拟机会冻结一段时间。
主虚拟机 OOM 错误会导致作业失败,并显示“无法获取任务”错误。
工作器虚拟机 OOM 错误会导致 YARN HDFS 上的节点丢失,从而延迟 Dataproc 作业的执行。
Yarn 内存控制
Yarn 提供三种类型的内存控件:
- 基于轮询(旧版)
- 严格模式
- Elastic
默认情况下,Dataproc 不会将 yarn.nodemanager.resource.memory.enabled
设置为启用 YARN 内存控件,原因如下:
- 如果未正确配置容器大小,严格的内存控制可能会导致有足够的内存,从而终止容器。
- 弹性内存控制要求可能会对作业执行产生不利影响。
- 当进程过度占用内存时,YARN 内存控件可能无法阻止 OOM 错误。
Dataproc 内存保护
当 Dataproc 集群虚拟机面临内存压力时,Dataproc 内存保护会终止进程或容器,直到 OOM 条件移除。
以下 Compute Engine 上的 Dataproc 映像版本中为以下集群节点提供了 Dataproc 内存保护:
角色 | 1.5 | 2.0 | 2.1 |
---|---|---|---|
主虚拟机 | 1.5.74+ | 2.0.48+ | 全部 |
工作器虚拟机 | 不可用 | 2.0.76+ | 2.1.24+ |
驱动程序池虚拟机 | 不可用 | 2.0.76+ | 2.1.24+ |
如何识别 Dataproc 内存保护终止
- Dataproc 内存保护功能以代码
137
或143
终止退出的进程。 - 工作器节点终止:
- Dataproc 会递增
dataproc.googleapis.com/node/problem_count
的累计指标,并将reason
设置为ProcessKilledDueToMemoryPressure
。 - 如果启用了 Cloud Logging,Dataproc 将写入
google.dataproc.oom-killer
日志,其中显示“A process is killed due to memory information: [process name]”。 - 如果 YARN 容器终止,Dataproc 会在 YARN 资源管理器中写入以下消息:“[container id] exited with code 137, which 可能表示 [node id] 上的内存压力”
- Dataproc 会递增
- 主组件或驱动程序池节点终止:作业驱动程序失败并显示
Driver received SIGTERM/SIGKILL signal and exited with [INT] code
。
OOM 解决方案
本部分介绍了可能因 OOM 问题而导致的作业和容器终止。
作业失败并显示“驱动程序接收到 SIGTERM/SIGKILL 信号,并退出了 [INT] 代码”
建议:
- 如果集群具有驱动程序池,请提高
driver-required-memory-mb
以增加临时作业内存用量。 - 如果集群没有驱动程序池,请重新创建集群,从而降低并发作业数上限(计算方式为
(total master memory in MB - 3584MB) / driver-size-mb
)。您可以通过以下方式降低此数字:- 设置
dataproc:dataproc.scheduler.max-concurrent-jobs
,或 - 将
dataproc:dataproc.scheduler.driver-size-mb
设置为更大的数字(默认值为1024MB
)。
- 设置
- 请考虑使用具有额外内存的主节点机器类型。
使用退出代码 137 或 143 退出容器
建议:
如果 Dataproc 内存保护功能终止了容器(请参阅如何识别 Dataproc 内存保护功能终止):
- 检查容器大小配置是否正确。
- 请考虑降低
yarn.nodemanager.resource.memory-mb
。此属性控制用于调度 YARN 容器的内存量。 - 如果作业容器持续失败,请检查数据倾斜是否导致特定容器的使用量增加。如果出现这种情况,请重新对作业进行分区或增加工作器大小,以满足额外的内存要求。