Yarn申请的内存的精确计算(转载+应用到自己的情况中)
这篇博客主要是利用[1]中的流程来尝试估算自己在运行spark on 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得到:
说实话,我个人感觉[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: