spark任务在yarn中的资源分配

yarn中spark任务的资源分配

监控页面: master://8088

所占内存总大小: 参数如下图:

在这里插入图片描述

实际情况中,应用程序申请到的资源量一定大于所申请的资源量

例如:spark driver指定内存 2g,executor指定内存 2g*3 合计应该是8192M内存

但实际上分配的内存或许为 12288M 等,为何会出现这样的情况?

因为由JVM自身的开销,并且还涉及到一个名词——规整化因子

并且yarn的不同任务调度模式下的资源分配总理的计算方式是不同的

规整化因子关于内存的默认配置: yarn.scheduler.increment-allocation-mb=1024M

在FIFO schedule与Capacity schedule下,规整化因子不会随着改变配置而改变(1024M)

在fair schedule下,规整化因子自己调整会生效

那么规整化因子的内存配置代表的是谁的内存呢?

由spark.yarn.executor.memoryOverhead参数控制,默认是 MAX(executorMemory*0.10,384M)

384M代表JVM自身的开销,最小的需求为384M

实际内存的计算公式,源码如下

var executorMemory = 1024 // 默认值,1024MB
val MEMORY_OVERHEAD_FACTOR = 0.10  // OverHead 比例参数,默认0.1
val MEMORY_OVERHEAD_MIN = 384

val executorMemoryOverhead = sparkConf.getInt("spark.yarn.executor.memoryOverhead",
math.max((MEMORY_OVERHEAD_FACTOR * executorMemory).toInt, MEMORY_OVERHEAD_MIN))
// 假设有设置参数,即获取参数,否则使用executorMemoryOverhead 的默认值

val executorMem = args.executorMemory + executorMemoryOverhead
// 最终分配的executor 内存为 两部分的和

所以上面那个例子:

spark-submit --master yarn-cluster --name test --driver-memory 2g --executor-memory 2g --executor-nums 3

在yarn-cluster模式下提交,并且yarn在fair schedule调度模式下,按道理JVM所占用的内存为:

Max(2g*0.1,384)=384M,但实际并不是这样的, 当规整化因子的内存大小设定为 1024M时,JVM所占用的实际内存为:

ceil(a/b)*b , a为程序申请的JVM资源,b为规整化因子中内存的参数大小

也就是说 不足1024M,按照1024M计算,取满足所需jvm内存大小时,规整化因子的最小整倍数的值。

所以:ceil(384/1024)*1024=1024M=1g

所以分配的内存为: 3*(2+1)+(2+1)=12g=12288M

那如果规整化因子的内存增量设定为512M呢?

ceil(384/512)*512=512M=0.5g

memory=> 3*(2+0.5)+(2+0.5)=10g=10240M

如果使用yarn-client方式提交呢?

不同的方式提交spark任务,资源消耗也是不同的,无论哪种方式,ApplicationMaster都会占用一个Container

不同的是,Cluster模式下,内存大小与cpu的核数由driver-memory与driver-cpu来指定,但是Client模式下,Container默认只有1g内存,1个cpu核心

spark-submit --master yarn-client --name test --driver-memory 2g --executor-memory 2g --executor-nums 3

所分配的内存为: 3*(2+1)+1=10g=10240M

ory 2g --executor-memory 2g --executor-nums 3

所分配的内存为:    3*(2+1)+1=10g=10240M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值