目录
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
如果遇到以上问题,很有可能就是内存除了问题,可以先尝试增加内存。