首先解释一下名词:
num-executors 线程数:一般设置在50-100之间,必须设置,不然默认启动的executor非常少,不能充分利用集群资源,运行速度慢
executor-memory 线程内存:参考值4g-8g,num-executor乘以executor-memory不能超过队列最大内存,申请的资源最好不要超过最大内存的1/3-1/2
executor-cores 线程CPU core数量:core越多,task线程就能快速的分配,参考值2-4,num-executor*executor-cores的1/3-1/2
driver-memory Driver申请的内存,默认是1G 在集群模式下使用
driver-cores Driver可以使用的内核数,默认是1,仅仅在集群下使用
看一条实战的命令:
spark-submit
--name xxxxxxxxx
--class com.xx.xxx.SparkDecode2Parquet
--driver-memory 1G
--driver-cores 1
--executor-cores 6
--num-executors 6
--executor-memory 9G
--deploy-mode cluster
--supervise --master yarn
hdfs://22.00.00.00:8020/user/adms/xxx.3.jar
公式:
每个executor所申请的内存=
spark-executor-memory + spark.yarn.executor.memoryOverhead【堆外内存 因为executor运行的时候可能会超过申请的内存 所以要预留些】
spark.yarn.executor.memoryOverhead= Max( 384MB, 7% * spark.executor-memory )
也就是说
如果我们为每个executor申请2G内存,ApplactionMaster实际上将会申请2G+max(384,0.07*2*1024)=2G+384M~=2.4G
接下来我们看下怎么调优
7个节点 63G内存 cpu16
我们可以先设置 --executor-cores 为5 建议的最大值 因而 总核数为16*5=80
--num-executors =总核数/每个executor核数 =80/5 -1=15 【-1是因为要留给AM】
每个节点的executor数目=--num-executors/ --executor-cores =15/5=3
--executor-memory= 每个节点的内存/每个节点executor数目=63/3=21G 因为--executor-memory=--executor-memory+spark.yarn.executor.memoryOverhead【堆内存】所以=21G+max(384,0.07*21*1024) 约等于 23G
--num-executors 15 --executor-cores 5 --executor-memory 23G
所以应该这么写:
spark-submit
--name xxxxxxxxx
--class com.xx.xxx.SparkDecode2Parquet
--driver-memory 1G
--driver-cores 1
--executor-cores 5
--num-executors 15
--executor-memory 23G
--deploy-mode cluster
--supervise --master yarn
hdfs://22.00.00.00:8020/user/adms/xxx.3.jar
所以一切都从--executor-cores开始吧!
具体的其他一些参数,都可以在官网看到,有时间在写出来吧。
希望能有帮助。