资源参数调优:
Spark资源参数调优,其实主要就是对Spark运行过程中各个使用资源的地方,通过调节各种参数,来优化资源的使用效率,从而提高Spark的运行效率。
num-executors
###参数说明:该参数用于设置Spark作业总共要用多少个Executor进程来执行。Driver在向集群管理器申请资源时,资源管理器会尽可能按照设置在集群各个节点上,启动相应的Executor进程。该参数较为重要,如果不设置默认只会启动较少的Executor进程,这样Spark运行速度是很慢。
###调优建议:每个Spark作业的运行一般设置50~100个Executor进程比较合适。

executor-memory
###参数说明:设置每个executor进程的内存大小(直接影响JVM OOM)。
###调优建议:每个Executor内存设置,要考虑整个团队的资源,executor-memory * num-executor的总资源是不能超过队列最大内存量,总资源建议占团队资源的1/3,可以考虑将executor-memory 4~8G。

executor-cores
###参数说明:设置每个executor中的CPU core数量, CPU core数决定了每个Executor进程并行执行task线程的能力,因为每个CPU core同一时间只能执行一个task任务。因此每个executor的CPU的core数量越多,完成相应task数量越快。
###调优建议:同设置executor-memory一样考虑整体团队的资源, executor-cores*num-executors不超过团队资源的1/3,可以考虑将Executor-cores 设置为 2~4个比较合适。

driver-memory
###参数说明:设置driver驱动的内存
###调优建议:通常driver的内存不用设置,如果需要使用collect算子将RDD数据全部拉取到Driver上,那么需要足够大的内存来避免内存溢出。

spark.default.parallelism
###参数说明: 该参数设置的是每个stage的默认task数量。该参数极为重要如果不设置会直接影响spark的作业性能。
###调优建议: 如果不设置会根据hdfs的block数量来设置task数量,默认一比一,这样对spark运行优化产生不良影响,前面设置的executor和cores这些都将受到影响,因此将每个stage的task数量设置为 = executor-cores*num-executors * 2~3比较合适,这样会充分利用Spark集群的资源。

spark.storage.memoryFraction
###参数说明:该参数是设置RDD持久化数据在executor中内存的占比(默认是0.6).因为executor中内存是分为3部分:持久化,shuffle和聚合,执行代码。
###调优建议:当需要持久化的RDD较多,那么为了避免内存不够使用磁盘而导致的io提高降低了性能,可提高参数占比,相反如果需要shuffle类操作较多,持久化较少,为了避免频繁gc导致的效率降低,则可以降低该参数占比。

spark.shuffle.memoryFraction
###参数说明: 该参数是设置shuffle过程中一个task拉取到上个stage的task输出之后,进行聚合能使用的Executor的内存占比(默认0.2)
###调优建议: 如果发现作业由于频繁的gc导致的运行缓慢,意味着task任务执行代码的内存不够使用,所以减低该参数;如果作业RDD持久化操作较少,则可以适当提高该参数,如果shuffle本身RDD操作较多,也需要提高该参数,使总体处于动态平衡的状态,将内存资源优先供给与缺口处。

参考示例:

./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 on yarn调优 spark调优参数_调优