Spark性能优化-资源调优


Spark性能优化分为四个方面:

1、开发调优
2、资源调优
3、数据倾斜调优
4、shuffle调优


资源调优

num-executors
参数说明:
该参数用于设置Spark作业总共要用多少个Executor进程来执行。
调优建议:
根据集群的资源大小去配置,如果资源足够,一般设置50~100个左右的Executor比较合适。

executor-memory
参数说明:
该参数用于设置每个Executor进程的内存。Executor内存的大小,很多时候直接决定了Spark作业的性能,而且跟常见的JVM OOM异常,也有直接的关联。
调优建议:
每个Executor进程的内存设置4G~8G较为合适。num-executors乘以executor-memory不能超过集群队列的最大内存。

executor-cores
参数说明:
该参数用于设置每个Executor进程的CPU core数量。
调优建议:
Executor的CPU core数量设置为2~4个较为合适。num-executors * executor-cores不要超过队列总CPU core数量。

driver-memory
参数说明:
该参数用于设置Driver进程的内存。
调优建议:
Driver的内存通常来说不设置,唯一需要注意的一点是,如果需要使用collect算子将RDD的数据全部拉取到Driver上进行处理,那么必须确保Driver的内存足够大,否则会出现OOM内存溢出的问题。

spark.default.parallelism
参数说明:
该参数用于设置每个stage的默认task数量。这个参数极为重要,如果不设置可能会直接影响你的Spark作业性能。
调优建议:
Spark官网建议的设置原则是,设置该参数为num-executors * executor-cores的2~3倍较为合适。

spark.storage.memoryFraction
参数说明:
该参数用于设置RDD持久化数据在Executor内存中能占的比例,默认是0.6。也就是说,默认Executor 60%的内存,可以用来保存持久化的RDD数据。
调优建议:
如果Spark作业中,有较多的RDD持久化操作,该参数的值可以适当提高一些,保证持久化的数据能够容纳在内存中。但是如果Spark作业中的shuffle类操作比较多,而持久化操作比较少,那么这个参数的值适当降低一些比较合适。

spark.shuffle.memoryFraction
参数说明:
该参数用于设置shuffle过程中一个task拉取到上个stage的task的输出后,进行聚合操作时能够使用的Executor内存的比例,默认是0.2。也就是说,Executor默认只有20%的内存用来进行该操作。
调优建议:
如果Spark作业中的RDD持久化操作较少,shuffle操作较多时,建议降低持久化操作的内存占比,提高shuffle操作的内存占比比例,避免shuffle过程中数据过多时内存不够用,必须溢写到磁盘上,降低了性能。

参考示例

./bin/spark-submit \
  --master yarn-cluster \
  --num-executors 50 \
  --executor-memory 8G \
  --executor-cores 4 \
  --driver-memory 1G \
  --conf spark.default.parallelism=500 \
  --conf spark.storage.memoryFraction=0.5 \
  --conf spark.shuffle.memoryFraction=0.3 \

你可能感兴趣的:(Spark性能优化-资源调优)