假设app没有内存泄露且heap usage正常,这个问题一般是由于memory + memoryOverhead超过yarn的监控值后Yarn的保护措施,其解决方法:
1)增加spark.yarn.executor.memoryOverhead的值,这个最小默认值是max(384M, executor mem * 0.07); 或增加spark.yarn.driver.memoryOverhead的值,这个最小默认值是max(384M, driver mem * 0.07)
2) 可适当降低spark.executor.memory或spark.driver.memory的值
3) 增加任务并行度
4)激活dynamic allocation
5)spark.memory.fraction change for 0.8 or 0.85 and reduce the spark.memory.storageFraction to 0.35 or 0.2