本文介绍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参数。
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内存充足,通常是数据倾斜所致,需检查数据分布并优化。