Yarn申请的内存的精确计算(转载+应用到自己的情况中)

这篇博客主要是利用[1]中的流程来尝试估算自己在运行spark on yarn模式时申请的内存数值。

 

Yarn申请的内存的精确计算(转载+应用到自己的情况中)

 

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

 

 

spark的配置参考Web UI的Enviroment标签(下面参数来自spark-defaults.sh,与spark-env.sh有重叠,如果不确定哪个为准就以Web UI为准)

spark.driver.memory=2g

spark.executor.memory=1g

那么spark任务的提交参数为,driverMemory=2G,executorMemory=1G,executorNum = 1
minContainer=512MB
Increment =1024MB
则该任务
executorContainerMemory计算过程如下

申请资源数:executor = Max(executorMemory*0.1,384M)+executorMemory=1408MB

我们来验证下上面的结果:

http://master:8088->点击ID下方的application_1588751040057_0002->点击Logs->stdout得到:

Yarn申请的内存的精确计算(转载+应用到自己的情况中)

说实话,我个人感觉[1]中后半部分的计算不是太准,我后来自己想了一个:

[(executor的数量)*1408MB](1+20%余量)约等于5G

executor的数量可以通过命令行设置:

spark-submit --num-executors 4

也可以通过$SPARK_HOME/conf/spark-defaults.conf来设置:

spark.executor.instances  4

 

注意哈:如果不设置spark.executor.instances或者num-executors,网传num-executors默认为2这个是不准确的,

这个2只是一个初始化的值(也可以理解成是最小值,一般都比这个大),具体根据是[2]:

--num-executors or spark. executor. instances acts as a minimum number of executors with a default value of 2. The minimum number of executors does not imply that the Spark application waits for the specific minimum number of executors to launch, before it starts.

Reference:

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

[2]Autoscaling in Spark