如何准确计算Spark On Yarn资源消耗 - spark On Yarn内存计算

spark on yarn 内存计算


摘要:相信每个写spark 的 sparker 都有过 spark on yarn 的任务提交经历,或许在你集群资源够多的情况下,我们只关注分配的资源是否能另任务顺畅的跑起来,而不会去关注生成一个spark任务最终在yarn上面消耗了多少的资源。不过如果你的集群资源并没有多到任你挥霍的程度,这篇文章可以教你如何把集群资源了如指掌。

1.Continer数量计算


Container是Yarn中的一个动态资源分配的基础概念,其拥有一定的内存,核数,由RM分配给ApplicationMaster或者MapTask或者ReduceTask,而后,我们需要的程序就在Container为基础的容器中运行起来。

public static Container newInstance(ContainerId containerId, NodeId nodeId,
			String nodeHttpAddress, Resource resource, Priority priority,
			Token containerToken) {
		Container container = Records.newRecord(Container.class);
		container.setId(containerId);
		container.setNodeId(nodeId);
		container.setNodeHttpAddress(nodeHttpAddress);
		container.setResource(resource);
		container.setPriority(priority);
		container.setContainerToken(containerToken);
		return container;
	}

一个spark任务会产生几个Continer?
count = ExecutorNum + 1
也就是说最后申请的Continer数量为Executor的数量加上driver即为spark任务在yarn上执行最终需要的Continer数量。

2.Spark任务申请总资源计算


spark任务资源申请除了自己配置的资源外,还需要额外的计算资源,这部分计算资源就是overheadMemory,所以spark的资源申请数量为下列公式所示:

executor = executorMemory+Max(executoryMemory0.1,384)
driver = driverMemory+Max(driverMemory
0.1,384)

其中,384是spark默认overhead大小。Max(x,x)表示两者取最大值。

3.Spark On Yarn 内存计算

在介绍了,spark任务在yarn运行时需要的Continer数量,以及内存大小之后,我们再来看spark on yarn的时候整体任务在yarn中占用资源大小。

Core: yarn中Core指的是Continer数量,所以Core = ContinerNum

而内存的计算则较为复杂了,设 单个Continer向集群申请的资源经我们上面公式算出来的需要申请的内存大小为:excutorTotalMemory ,则该Continer在yarn集群上占用的最终资源为continerMemory。
minContiner = yarn.scheduler.minimum-allocation-mb(continer分配资源的最小值)
Increment = yarn.scheduler.increment-allocation-mb(yarn分配资源的增量,也叫规整化参数,默认值为1024 mb)
resultMemory的计算方式如下所示:

If(totalMemory<=minContiner){
	continerMemory = minContiner
}else{
	continerMemory = minContiner + Math.ceil((excutorTotalMemory - minContiner)/increment) * increment
}

总结

例如某个spark任务的提交参数为,driverMemory=2G,executorMemory=2G,executorNum = 1
minContiner=512m
Increment =1024m
则该任务
executorContinerMemory计算过程如下

申请资源数:executor = Max(executorMemory*0.1,384M)+executorMemory=2432M
ContinerMymory = 512+Math.ceil((2432-512)/1024.0)*1024 = 2.5G

driverContinerMemory计算过程同上:2.5G
最终该任务在yarn消耗资源为5G
可以看出来,spark任务最终消耗资源并非为初始化资源数。

你可能感兴趣的:(spark,大数据,hadoop,集群搭建)