1 OOM 优化
Container killed by YARN for exceeding memory limits. 19 GB of 16 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead
问题原因1: 数据倾斜或数据量太大,导致executor处理的数据量太大超过executor内存限制。
解决办法: 一般加大executor-memory内存量。 或者重分区增大分区数量,减小每分区数据量。
问题原因2: 如果数据量本身并不大的情况下或着加大executor-memory也不太稳定(时好时坏)。说明程序某些操作可能大量使用的堆外内存(如spark sql中get_json_object函数可能导致大量使用堆外内存)
可以考虑手动设置加大spark.yarn.executor.memoryOverhead参数值。
解决办法: 直接增加对外内存spark.yarn.executor.memoryOverhead的值。
spark.yarn.executor.memoryOverhead参数:官方解释
大概意思: 是JVM 本身开销,或者内部字符以及本地开销使用,如运行pyspark时 python开销。
正常情况下: spark.yarn.executor.memoryOverhead随着executor-memory增加而增加,在增加executor-memory内存不明显的情况下,可以手动设置spark.yarn.executor.memoryOverhead
可根据Container killed by YARN for exceeding memory limits. 19 GB of 16 GB physical memory used,这里的20G估算出堆外内存实际需要19G*0.1约等于1.9G,因此最少应该设置spark.yarn.executor.memoryOverhead为2G, 可以保险起见设置3-4G.
注意: 设置memoryOverhead过大可能导致executor-memory分配太大, 当executor实例较多时,造成资源浪费。如下截图。
手动设置一个较大的值overhead=16G, 导致实际申请的overhead值和executor内存达到32G
2 动态 资源分配调优。
CDH中spark2.x 默认情况下开启了 动态资源分配spark.dynamicAllocation.enabled=true。要关闭的话, 设置为false即可。
spark.dynamicAllocation.maxExecutors最大使用的executor数量, 避免JOB占用集群中大量资源。因为动态分配资源如果有pending状态TASK超过1S钟,就会申请增加executor数量。
1 、2、 4、 8倍数增加。
spark.dynamicAllocation.minExecutors 设置最小的excutor数量, 如果 提交参数设置的executor-instances/executor-num数量大于此参数,则最小数量以提交参数为准。
spark.executor.memory 设置执行器内存大小, 不指定的情况下使用默认值为一个容器的最小申请