SparkOnYarn资源申请

    当前项目中是将Spark任务提交到Yarn上运行的,但是发现了一个问题,这个任务在Yarn占用的内存远超程序中所申请的内存两。例如我现在有一个yarn-client模式运行任务,向Yarn申请两个Executor,每个Executor使用1G内存,Driver内存配置的是5G,发现Yarn给程序分配的内存如下:

    Yarn启动了3个Container,内存给了4.125G…所以研究下,Yarn是怎么给Spark程序分配内存的。

 

研究下内存分配:

    之前《SparkOnYarn与StandAlone模式的区别》文章中分析过,Spark On Yarn程序启动的时候会创建Client,Client会检查是否有足够的资源启动AM,足够就启动AM,由AM向RM申请资源启动Executor,来看下检查资源是否足够的方法:

    方法里面检查了两部分的资源,一部分是Executor的内存资源,另外一部分是AM的内存资源,两部分资源都有Overhead额外的内存资源...

AM总内存资源:

从代码中可以看出,AM在ClusterMode下获取的就是Driver端配置的资源,Cores就是Driver端配置的核数;Client模式下获取的就是AM_MEMORY,即程序给AM配置的资源(我们使用的CDH版本的Hadoop默认是1G)。

Overhead是额外申请的内存量,如果程序中有过配置,那么使用程序中设置的内存;否则会默认使用一个公式计算内存量:

默认情况下为:math.max(0.1 * amMemory,384M),即默认最少会额外申请384M内存。

 

Executor总内存资源:

Executor额外内存申请的方式和AM额外内存申请的方式一样,使用的是相同的公式计算的,默认情况下也是最少会申请384M额外内存。

 

所以可以看出来,Spark任务提交到Yarn上要申请四部分的内存:AM+AMOverhead+Executor+ExecutroOverhead,其中AM在Cluster其实是Driver设置的内存,在Client模式才是真正AM设置的内存。(Cluster模式下还没有验证过,等后续有时间了再验证下,先把结论放在这里,不对再改吧)

 

为什么会有3个container?

不管CLient或CLuster模式下,AM都会占用一个Container来运行;程序申请了两个Executor,占用了两个Container,加上AM正好三个Container。在当前我们使用的CDH版本中,Container默认有1G内存,1个cpu核。

 

Yarn内存分配规整化:

为了易于管理资源和调度资源,Yarn内置了资源规整化算法,它规定了最小可申请资源量、最大可申请资源量和资源规整化因子。

如果应用程序申请的资源量小于最小可申请资源量,则YARN会将其大小改为最小可申请量;如果应用程序申请的资源量大于最大可申请资源量,则会抛出异常,无法申请成功;规整化因子是用来规整化应用程序资源的,应用程序申请的资源如果不是该因子的整数倍,则将被修改为资源规整化因子的最小的整数倍

    例如配置文件中设置成128M,如果Executor + ExecutorOver 加起来是126M,那么就会规整化到128M上;如果加起来是240M,那么就会规整化到256M上。配置文件中对应的配置项为:yarn.scheduler.increment-allocation-mb

 

 

 

 

参考:

https://www.iteye.com/blog/zhangxiong0301-2202992(Yarn资源规整化)

   

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值