为何AWS EMR的spark.yarn.executor.memoryOverhead默认18.75%高于Spark的10%?
AWS EMR Spark执行器默认内存overhead占比18.75%的原因
首先明确两类默认配置的差异:
- Spark官方默认规则:
spark.executor.memoryOverhead= 执行器堆内存 * 10%,最低值为384MB - AWS EMR 5.22及后续版本默认规则:新增
spark.yarn.executor.memoryOverheadFactor配置,默认值为0.1875,即overhead为执行器堆内存的18.75%
EMR将默认占比设为远高于Spark官方的18.75%,主要有以下几方面原因:
- 适配EC2实例的内存分配特性
EC2实例本身会预留一部分内存给操作系统、虚拟化层运行,EMR会提前扣除这部分内存后再给YARN分配可使用的资源池,18.75%的比例是经过实测的最优值,既能最大化利用实例的可用内存,也能避免overhead不足导致YARN直接杀掉Spark执行器的问题。 - 覆盖EMR内置增强组件的内存开销
EMR的Spark发行版自带很多官方开源版本没有的优化组件,包括S3访问的Native加速实现、动态资源调度增强逻辑、内置日志采集和监控探针等,这些组件的运行都需要占用Spark执行器的堆外内存,10%的官方默认值在生产场景下很容易触发堆外内存溢出,18.75%的预留可以覆盖绝大多数通用场景的额外内存需求,减少用户手动调参的成本。 - 适配Spot实例的运行场景
EMR大量适配竞价型Spot实例来降低用户算力成本,Spot实例被强制回收时的任务迁移、状态暂存逻辑需要额外的堆外内存做缓冲,更高的overhead比例可以降低节点回收时的作业失败概率,提升Spot实例场景下的作业稳定性。 - 数值的合理性
18.75%刚好等于3/16,这个比例是AWS基于海量用户作业的运行数据统计得到的,既能满足90%以上通用Spark作业的堆外内存需求,也不会因为预留过多overhead导致堆内存浪费,在稳定性和资源利用率之间达到了最优平衡。
内容的提问来源于stack exchange,提问作者user8866279
相关产品推荐
相关产品推荐

