并行度:Spark 作业中,会根据 action 操作划分成多个 job,每个 job 中会根据 shuffle 划分成多个 stage,每个 stage 会分配多个 task 去执行,各个 stage 划分的 task 数量就代表了 Spark 作业在该 stage 的并行度。
一,调整并行度的作用
假设 Spark 作业的处理的数据量是不变的,这些数据会被分配到每个 task 中去处理,在集群配置资源分配好的情况下,提升并行度,相当于分配越多的 task,这样每个 task 分配的数据量就会越少,有助于提升执行效率。
当然也不是无限提升就有好处,这和 executor 分配的 core 的数量有关,每个 core 一次只能执行一个 task,所以并行度的调整和 core 的数量有很大关系。
比如,我们在 spark-submit 的 shell 脚本中配置了 50 个 executor,每个 executor 有 10g 内存和 3 个 core。这样的配置已经达到了集群或者 yarn 资源队列的上限。这时候我们来调整并行度,50 个 executor,每个 executor 有 3 个 core,那么一共有 150 个 core,如果我们这时候设置的并行度为 100 个,那么可以看出在每个 stage 执行任务的 task 数量只有 100 个,executor 用来执行 task 的 core 还有 50 个没被利用。相当于资源被浪费了。
二,怎么设置
1,task 的数量至少应该设置成和集群中配置的 core 数量一致。
2,官方推荐的是:task 的数量,设置成 core 数量的 2~3 倍。
这是因为:实际生产情况下,有些 task 的运行会快一点,比如 50s 就结束了,有些慢一点,比如 1 分钟,在这种情况下,避免让 core 有空闲,造成资源浪费,可以让 task 的数量多一点,这样可以让结束较快的 task 对应的 core 不会空闲下来。
3,设置方式:
SparkConf conf = new SparkConf()
.set("spark.default.parallelism", "500")
.xxx