以spark1.6为例,使用内存和CPU的无外乎三个:appMaster、driver、executor,下面分别分析spark on yarn的client与cluster模式下的内存和CPU分配
一、vcores
1、driver核数:
client模式:无
cluster模式:spark.driver.cores=1(默认)
2、AppMaster核数:
client模式:spark.yarn.am.cores=1(默认)
cluster模式:spark.driver.cores=1(默认)
3、executor核数:
spark.executor.cores=1(默认)
4、executor内每个task使用的核数:
spark.task.cpus=1(默认)
5、每个executor内能够并行运行的task数:
spark.executor.cores / spark.task.cpus
6、yarn上启动executor的个数:
SPARK_EXECUTOR_INSTANCES/spark.executor.instances=2(默认)
7、driver核数 + executor核数 * executor个数 + AppMaster核数(client模式) = 要向yarn申请的总的vcores,
具体yarn给多少颗vcores,类似于mapreduce on yarn的情况,参考文章:
https://www.cnblogs.com/yesecangqiong/p/6274427.html
注意---------------------------
1、:spark.driver.cores只能在cluster模式下使用
2、spark.executor.instances与spark.dynamicAllocation.enabled不能共同使用,如果两个都做了配置,spark.executor.instances有效
3、要向使spark.task.cpus>1时起作用,还应该保证yarn的配置文件"capacity-scheduler.xml"中的配置选项"yarn.scheduler.capacity.resource-calculator"
的值为:"org.apache.hadoop.yarn.util.resource.DominantResourceCalculator",而不应该是默认的"org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator"
可以参考文章:https://www.cnblogs.com/yesecangqiong/p/10125333.html
二、内存
1、driver需要申请的内存 = 基本内存 + 额外内存
基本内存:
spark.driver.memory=1g(默认)
额外内存:
1、有参数配置则直接等于参数配置
spark.yarn.driver.memoryOverhead
2、无参数配置(即默认)
max(driver基本内存 * 0.1,384M)
2、appMster需要申请的内存 = 基本内存 + 额外内存(memoryOverhead)
基本内存:
client模式:spark.yarn.am.memory=512MB(默认)
cluster模式:appMaster与driver运行于同一个JVM(yarn上的同一container),决定于:spark.driver.memory=1g(默认)
额外内存:
1、有参数配置则直接等于参数配置
client模式:spark.yarn.am.memoryOverhead
cluster模式:spark.yarn.driver.memoryOverhead
2、没有配置相应参数(即默认):
yarn-client模式:max(AppMaster基本内存 * 0.1,384M)
yarn-cluster模式:max(Driver基本内存 * 0.1,384M)
3、executor需要申请的内存 = 基本内存 + 额外内存
基本内存:
spark.executor.memory=1g(默认)
额外内存:
1、有参数配置则直接等于参数配置
spark.yarn.executor.memoryOverhead
2、无参数配置(即默认)
max(executor基本内存 * 0.1,484M)
4、driver内存 + executor内存 * executor个数 + AppMaster内存(client模式) = 要向yarn申请的总的内存,
具体yarn给多少内存,类似于mapreduce on yarn的情况,参考文章:
https://www.cnblogs.com/yesecangqiong/p/6274427.html
注意--------------------------------:
在client模式下,spark.driver.memory不能由代码中的SparkConf配置指定,只能通过配置文件/运行脚本中指定
三、参考官方文档:
#configuration