资源调优
为spark程序提供合理的内存资源,cpu资源等
spark-sumbmit脚本常见参数
1、–conf PROP=VALUE ==》手动给sparkConf指定相关配置,比如–conf spark.serializer=org.apache.spark.serializer.KryoSerializer
2、properties-file FILE ==》如果配置项比较多,或者接收的配置是个文件,我们就可以使用这种文件来写配置文件
3、driver-memory ==》driver程序的内存大小,默认值1G**
4、executor-memory** ==》每一个executor的内存大小,默认1G-
5、-driver-cores ==》在standalone的cluster模式下面生效,driver的cpu core,因为在这种(集群模式)模式下面driver是有worker启动的,和executor一样在集群中运行。client模式下面driver不在spark集群中启动,也就不会占用spark集群的资源。
6、–total-executor-cores ==》在standalone的生效,总的executor的cpu core的个数**-
7、-supervise**** ==》在standalone的cluster模式下面生效,如果driver启动失败,会有spark集群负责重新启动。driver ha的配置的两个必不可少的条件:–deploy-mode cluster、–supervise-
8、-executor-cores**** ==》在standalone和yarn模式的生效,每一个executor的cpu core个数。total-executor-core/executor-cores=executor的个数-
9、-num-executors** ==》在yarn模式下面生效,executor的个数,总的executor的内存:num-executors*executor-me
集群调优实现
1、num-executors 是用来设置spark作业的executor进程来执行,
调优,根据spark作业的实际情况进行设置Executor进程,不能太多也不能太少,太少无法充分利用集群资源,太多部分队列可供无法给与充分资源
2、executor-memory 设置spark中每个executor进程的内存
调优 、建议每个executor进程内存设置4-8G较为合适,具体根据不同部门的资源队列设置如果你是跟团队里其他人共享这个资源队列,那么申请的总内存量最好不要超过资源队列最大总内存的1/3~1/2,避免你自己的Spark作业占用了队列所有的资源,导致别人的作业无法运行。
3、executor-cores 用于设置每个executor进程的cpu core个数量
调优 ececutor进程的CPU core个数建议设置2-4个较为合适,但还要看资源队列的最大CPU core个来分配,同样建议,如果是跟他人共享这个队列,那么num-executors * executor-cores不要超过队列总CPU core的1/3~1/2左右比较合适,也是避免影响其他人的作业运行。
4、driver-memory 设置Driver进程的内存
调优,通常不设置或设为1G 但注意若是使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。
5、spark.default.parallelism 设置每个stage的默认task数量
调优 不进行设置的话可能会影响spark作业性能默认的话一个HDFS block对应一个task因此默认的情况下task数量太少,设置的话设置该参数为num-executors * executor-cores的2~3倍较为合适,比如Executor的总CPU core数量为300个,那么设置1000个task是可以的,此时可以充分地利用Spark集群的资源。
6、spark.shuffle.memoryFraction 主要是用于设置一个executor中进行shuffle(read)操作的内存比例,默认为0.2,该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2
调优 、如果spark作业中RDD持久化操作较少shuffle操作过多是建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。此外,如果发现作业由于频繁的gc导致运行缓慢,意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。
7、spark.storage.memoryFraction 设置executor中用于进行持久化的内存比例默认为0.6也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据
调优 在spark作业中若是有较多的持久化操作则该参数值可以适当调高但是如果Spark作业中的shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适。此外,如果发现作业由于频繁的gc导致运行缓慢(通过spark web ui可以观察到作业的gc耗时),意味着task执行用户代码的内存不够用,那么同样建议调低这个参数的值。
spark-submit脚本配置模板
./bin/spark-submit \
--master yarn \
--deploy-mode cluster \
--num-executors 128 \
--executor-memory 27G \
--executor-cores 8 \
--driver-memory 8G \
--conf spark.default.parallelism=1600 \
--conf spark.storage.memoryFraction=0.5 \
--conf spark.shuffle.memoryFraction=0.3 \