Spark作业中,各个stage的task的数量,代表Spark作业在各个阶段stage的并行度。 分为资源并行度(物理并行度)和数据并行度(逻辑并行度)
在Spark Application运行时,并行度可以从两个方面理解:
如果Task的数量越多,能用的资源也多,那并行度自然就好。如果Task的数据少,资源很多,有一定的浪费,但是也还好。如果Task数目很多,但是资源少,那么会执行完一批,再执行下一批,自然会慢一些。所以官方给出的建议是,这个Task数目是core总数的2~3倍为最佳(最大压榨CPU处理能量)。如果core有多少Task就有多少,那么有些比较快的task执行完了,一些资源就会处于等待的状态。
如何设置task数量:
将task数量设置成与Application总CPU core数量相同(理想情况下,150个core分配150个task),官方推荐设置成Application总CPU 从热数量的2~3倍(150个CPU core,设置300~500个task);
与理想情况不同的是:有些task会运行的快一些,比如50秒就完了,也有些task可能会慢一点,要几分钟才能完成,所以如果你的task数量,刚好设置跟CPU core数量相同,也可能会导致资源的一定浪费,比如150个task,10个先运行完了,剩余140个还在运行,但是这个时候,就有10个core会处于等待状态。
参数spark.default.parallelism默认是没有值的,如果设置了值,是在shuffle的过程才会起作用
new SparkConf().set("spark.default.parallelism","10")
// rdd2的分区数就是10,rdd1的分区数不受这个参数的影响
val rdd2 = rdd1.reduceByKey(_+_)
如何根据数据量(task数目)配置资源
当提交一个Spark Application时,设置资源信息如下,基本已经达到了集群或者yarn队列的资源上限:
虽然分配充足了,但是问题是:并行度没有与资源相匹配,导致分配下去的资源都浪费掉了。合理的并行度的设置,应该要设置的足够大,大到可以完全合理的利用你的集群资源。可以调整task数目,按照原则:Task数量,设置成Application总CPU core数量的2~3倍
因篇幅问题不能全部显示,请点此查看更多更全内容