sparksubmit参数及调优1. spark submit参数介绍
你可以通过spark-submit --help或者spark-shell --help来查看这些参数。
使⽤格式:
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
# other options
<application-jar> \
[application-arguments]
参数说明
--master  MASTER_URL 如spark://host:port, mesos://host:port, yarn,  yarn-cluster,yarn-client, local
--deploy-mode DEPLOY_MODE Client或者master,默认是client
--class CLASS_NAME 应⽤程序的主类
--name NAME 应⽤程序的名称
--jars JARS  逗号分隔的本地jar包,包含在driver和executor的classpath下
--packages  包含在driver和executor的classpath下的jar包逗号分隔的”groupId:artifactId:version”列表
--exclude-packages  ⽤逗号分隔的”groupId:artifactId”列表
--repositories  逗号分隔的远程仓库
--py-files  PY_FILES  逗号分隔的”.zip”,”.egg”或者“.py”⽂件,这些⽂件放在python app的PYTHONPATH下⾯
--files FILES 逗号分隔的⽂件,这些⽂件放在每个executor的⼯作⽬录下⾯
--conf PROP=VALUE 固定的spark配置属性,默认是f
--properties-file  FILE  加载额外属性的⽂件
--driver-memory MEM  Driver内存,默认1G
--driver-java-options  传给driver的额外的Java选项
--driver-library-path  传给driver的额外的库路径
--driver-class-path  传给driver的额外的类路径
--executor-memory MEM  每个executor的内存,默认是1G
--proxy-user NAME 模拟提交应⽤程序的⽤户
--driver-cores NUM  Driver的核数,默认是1。这个参数仅仅在standalone集deploy模式下使⽤
--supervise  Driver失败时,重启driver。在mesos或者standalone下使⽤
--verbose  打印debug信息
-
-total-executor-cores NUM  所有executor总共的核数。仅仅在mesos或者standalone下使⽤
--executor-core NUM  每个executor的核数。在yarn或者standalone下使⽤
--driver-cores NUM  Driver的核数,默认是1。在yarn集模式下使⽤
--queue QUEUE_NAME 队列名称。在yarn下使⽤
--num-executors NUM  启动的executor数量。默认为2。在yarn下使⽤
2. Examples
#EX01  Run application locally on 8 cores(本地模式8核)
./bin/spark-submit \
--class org.amples.SparkPi \
--master local[8] \
/path/to/examples.jar \
100
#EX02 Run on a Spark standalone cluster in client deploy mode(standalone client模式)
./bin/spark-submit \
--class org.amples.SparkPi \
--master spark://207.184.161.138:7077 \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
#EX03 Run on a Spark standalone cluster in cluster deploy mode with supervise(standalone cluster模式使⽤supervise) ./bin/spark-submit \
--class org.amples.SparkPi \
--master spark://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
/path/to/examples.jar \
1000
#EX04 Run on a YARN cluster(YARN cluster模式)
export HADOOP_CONF_DIR=XXX
./bin/spark-submit \
--class org.amples.SparkPi \
-
-master yarn \
--deploy-mode cluster \  # can be client for client mode
--executor-memory 20G \
--num-executors 50 \
/path/to/examples.jar \
1000
#EX05 Run on a Mesos cluster in cluster deploy mode with supervise(Mesos cluster模式使⽤supervise)
./bin/spark-submit \
--class org.amples.SparkPi \
--master mesos://207.184.161.138:7077 \
--deploy-mode cluster \
--supervise \
--executor-memory 20G \
--total-executor-cores 100 \
path/to/examples.jar \
1000
3. spark on yarn
所谓的Spark资源参数调优,其实主要就是对Spark运⾏过程中各个使⽤资源的地⽅,通过调节各种参数,来优化资源使⽤的效率,从⽽提升Spark作业的执⾏性能。
以下参数就是Spark中主要的资源参数,每个参数都对应着作业运⾏原理中的某个部分,我们同时也给出了⼀个调优的参考值。
3.1 num-executors
参数说明:
该参数⽤于设置Spark作业总共要⽤多少个Executor进程来执⾏。Driver在向YARN集管理器申请资源时,YARN集管理器会尽可能按照你的设置来在
集的各个⼯作节点上,启动相应数量的Executor进程。这个参数⾮常之重要,如果不设置的话,默认只会给你启动少量的Executor进程,此时你的
Spark作业的运⾏速度是⾮常慢的。
参数调优建议:
每个Spark作业的运⾏⼀般设置50~100个左右的Executor进程⽐较合适,设置太少或太多的Executor进程都不好。设置的太少,⽆法充分利⽤集资源;
设置的太多的话,⼤部分队列可能⽆法给予充分的资源。
3.2 executor-memory
参数说明:
该参数⽤于设置每个Executor进程的内存。Executor内存的⼤⼩,很多时候直接决定了Spark作业的性能,⽽且跟常见的JVM OOM异常,也有直接的关联。
参数调优建议:
每个Executor进程的内存设置4G~8G较为合适。但是这只是⼀个参考值,具体的设置还是得根据不同部门的资源队列来定。可以看看⾃⼰团队的资源队列
的最⼤内存限制是多少,num-executors乘以executor-memory,是不能超过队列的最⼤内存量的。此外,如果你是跟团队⾥其他⼈共享这个资源队列,
那么申请的内存量最好不要超过资源队列最⼤总内存的1/3~1/2,避免你⾃⼰的Spark作业占⽤了队列所有的资源,导致别的同学的作业⽆法运⾏。
3.3 executor-cores
参数说明:
该参数⽤于设置每个Executor进程的CPU core数量。这个参数决定了每个Executor进程并⾏执⾏task线程的能⼒。因为每个CPU core同⼀时间只能执⾏⼀个
task线程,因此每个Executor进程的CPU core数量越多,越能够快速地执⾏完分配给⾃⼰的所有task线程。
参数调优建议:
Executor的CPU core数量设置为2~4个较为合适。同样得根据不同部门的资源队列来定,可以看看⾃⼰的资源队列的最⼤CPU core限制是多少,再依据设置的
Executor数量,来决定每个Executor进程可以分配到⼏个CPU core。同样建议,如果是跟他⼈共享这个队列,那么num-executors * executor-cores不要超过
队列总CPU core的1/3~1/2左右⽐较合适,也是避免影响其他同学的作业运⾏。
3.4 driver-memory
参数说明:
该参数⽤于设置Driver进程的内存。
参数调优建议:
Driver的内存通常来说不设置,或者设置1G左右应该就够了。唯⼀需要注意的⼀点是,如果需要使⽤collect算⼦将RDD的数据全部拉取到Driver上进⾏处理,
那么必须确保Driver的内存⾜够⼤,否则会出现OOM内存溢出的问题。
3.5 spark.default.parallelism
参数说明:
该参数⽤于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。
参数调优建议:
Spark作业的默认task数量为500~1000个较为合适。很多同学常犯的⼀个错误就是不去设置这个参数,那么此时就会导致Spark⾃⼰根据底层HDFS的block数量
来设置task的数量,默认是⼀个HDFS block对应⼀个task。通常来说,Spark默认设置的数量是偏少的(⽐如就⼏⼗个task),如果task数量偏少的话,就会
导致你前⾯设置好的Executor的参数都前功尽弃。试想⼀下,⽆论你的Executor进程有多少个,内存和CPU有多⼤,但是task只有1个或者10个,那么90%的
Executor进程可能根本就没有task执⾏,也就是⽩⽩浪费了资源!因此Spark官⽹建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍
较为合适,⽐如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利⽤Spark集的资源。
3.6 Fraction
参数说明:
该参数⽤于设置RDD持久化数据在Executor内存中能占的⽐例,默认是0.6。也就是说,默认Executor 60%的内存,可以⽤来保存持久化的RDD数据。根据你选择
的不同的持久化策略,如果内存不够时,可能数据就不会持久化,或者数据会写⼊磁盘。
参数调优建议:
如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提⾼⼀些,保证持久化的数据能够容纳在内存中。避免内存不够缓存所有的数据,导致数据只
能写⼊磁盘中,降低了性能。但是如果Spark作业中的shuffle类操作⽐较多,⽽持久化操作⽐较少,那么这个参数的值适当降低⼀些⽐较合适。此外,如果发现
作业由于频繁的gc导致运⾏缓慢(通过spark web ui可以观察到作业的gc耗时),意味着task执⾏⽤户代码的内存不够⽤,那么同样建议调低这个参数的值。
3.7 Fraction
参数说明:
该参数⽤于设置shuffle过程中⼀个task拉取到上个stage的task的输出后,进⾏聚合操作时能够使⽤的Executor内存的⽐例,默认是0.2。也就是说,Executor
默认只有20%的内存⽤来进⾏该操作。shuffle操作在进⾏聚合时,如果发现使⽤的内存超出了这个20%的限制,那么多余的数据就会溢写到磁盘⽂件中去,此时
就会极⼤地降低性能。
参数调优建议:
如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占⽐,提⾼shuffle操作的内存占⽐⽐例,避免shuffle过程中数据过多
时内存不够⽤,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运⾏缓慢,意味着task执⾏⽤户代码的内存不够⽤,那么同样建议调低
这个参数的值。
资源参数的调优,没有⼀个固定的值,需要根据⾃⼰的实际情况(包括Spark作业中的shuffle操作数量、RDD持久化操作数量以及spark web ui中显⽰的作业gc情况),
合理地设置上述参数。
资源参数参考⽰例
以下是⼀份spark-submit命令的⽰例,⼤家可以参考⼀下,并根据⾃⼰的实际情况进⾏调节:
./bin/spark-submit \
--master yarn-cluster \
jvm调优参数-
-num-executors 100 \
--executor-memory 6G \
--executor-cores 4 \
--driver-memory 1G \
--conf spark.default.parallelism=1000 \
--conf Fraction=0.5 \
--conf Fraction=0.3 \
reference