目录

num-executors

executor-memory

executor-cores

driver-memory

spark.default.parallelism

spark.storage.memoryFraction(Spark1.6之前的参数)

命令例子

总结:

  • driver-memory 使用collect算子需要设置,其他情况不用设置
  • num-executors=50~100 比较好(与集群节点数有关)
  • executor-memory=4G~8G
  • executor-cores=2~4(num-executors*executor-cors不要超过集群cpu core的1/3~1/2)
  • spark.default.parallelism=2~3*(num-executors&executor-cors)

建议:executor-memory 和 spark.default.parallelism 不懂源码不要设置,这两个参数是是gc关键参数,改不好就会导致executor gc很差。

如果运行速度较慢,调整num-executors的数量即可。

spark在运行的过程中常出现的问题

 很有可能就是内存除了问题,可以先尝试增加内存。

  • java.lang.OutOfMemoryError
  • ExecutorLostFailure
  • Executor exit code 为143
  • executor lost
  • hearbeat time out
  • shuffle file lost

重要的参数如下, 

num-executors

该参数用户设置spark作业总共需要多少个Exector进行来执行,这个参数很重要,如果不设置,默认只会启动少量的Executor,此时spark作业运行非常的慢。如果您的集群在1000个节点左右,那么建议设置为50~100个左右的Executor进行比较好,如果是100个节点,那么建议设置20~30个左右比较好,既不要设置的太多影响其他的任务,也不要设置的过少影响任务运行速度,需要根据节点来配置。

executor-memory

该参数用于设置每个Executor进程的内存,Executor内存的大小,直接决定spark作业的性能,而且跟常见的 jvm 内存溢出有关。所以建议每个Executor进程的内存设置4G~8G较为合适,但是这也只是一个参考值,具体设置还需要根据队列中任务的多少以及最大内存资源来设置,根据经验,内存最好不要超过资源队列的最大内存的1/3~1/2,避免自己的spark作业占用来所有的资源,导致队列中的其他任务无法运行。

executor-cores

该参数用于设置每个Executor进程的cpu core数量,一个cpu core同一时间只能运行一个task,因此每个Executor进程中的cpu core数量越多,越能够快速的执行完分配给自己的所有task任务,这里建议每个Executor的数量设置为2~4个较为合适,同样也要根据不同部门的资源队列来定,同样如果跟别人分享这个队列,那么num-executors*executor-cors不要超过cpu core的1/3~1/2左右较为合适,避免影响队列中其他任务的运行。

driver-memory

这个用来设置driver进程的内存。一般这个参数我们是不设置的,但是除非用collect算子需要设置。

spark.default.parallelism

该参数用户设置每个stage的默认task数量,这个参数及其重要,如果不设置可能会直接影响你的spark作业性能。来分析以下默认的task数量是有什么导致的?当然是由block块导致的,默认的情况下,一个block对应一个task任务,如果你上面的参数都设置了很多,这里不设置,那么相当于,你申请了资源还不用,这就是耍流氓,所以设置原则为num-executors&executor-cors的2-3倍较为合适。

如果executor 的总cpu core数量为300个,那么设置1000个task是可以的,此时可以充分的利用spark集群的资源。

spark.storage.memoryFraction(Spark1.6之前的参数)

该参数针对spark1.6之前,用于设置静态内存storage部分的内存,默认是0.6。

建议是如果你的spark任务重,需要持久化的内容很多,这个时候可以增加一些内存的比例。

命令例子

到这里,也就要到了这篇文章的尾声了,上面说了那么多,那么究竟该如何设置呢?下面给出一份例子。

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

最后再来说一下spark在运行的过程中常出现的问题

java.lang.OutOfMemoryError
ExecutorLostFailure
Executor exit code 为143
executor lost
hearbeat time out
shuffle file lost

如果遇到以上问题,很有可能就是内存除了问题,可以先尝试增加内存。