运行时OOM问题

更新时间:
复制为 MD 格式

本文介绍MaxCompute Spark作业运行时常见的OOM(Out Of Memory)问题及解决方案。

查看内存使用

LogView 2.0包含Sensor功能,可以查看Master以及每个Worker在运行时的内存和CPU使用情况。排查OOM问题时,建议先通过Sensor确认内存使用趋势,定位是堆内还是堆外内存不足。

Cannot allocate memory

该错误通常是堆外内存(Off-Heap)不足导致。

  • Executor端出现:增大spark.executor.memoryOverhead参数。

  • Driver端出现:增大spark.driver.memoryOverhead参数。

    image

java.lang.OutOfMemoryError: Java heap space

该错误通常是堆内内存不足导致,可通过以下方式解决:

  • 增大Executor堆内存:增大spark.executor.memory

  • 限制Executor并行度:减小spark.executor.cores。多个同时运行的Task共享Executor内存,减少并行度可使单个Task获得更多内存。

  • 增加分区数量:减小每个Executor负载。

  • 排查数据倾斜:如果仅部分Task出现OOM而其他Task内存充足,通常是数据倾斜所致,需检查数据分布并优化。

No route to host / Could not find CoarseGrainedScheduler

出现No route to host: workerd*********Could not find CoarseGrainedScheduler错误,极有可能是某些Executor发生OOM后进程被终止。此类错误不会直接显示OOM信息,需结合LogView Sensor确认内存使用情况,然后参考如下方案调整内存配置:

  • 增大Executor堆内存:增大spark.executor.memory

  • 限制Executor并行度:减小spark.executor.cores。多个同时运行的Task共享Executor 的内存,减少并行度可使单个Task获得更多内存。

  • 增加分区数量:减小每个Executor负载。

  • 排查数据倾斜:如果仅部分Task出现OOM而其他Task内存充足,通常是数据倾斜所致,需检查数据分布并优化。