简介:
     并行度就是Spark作业中,各个stage的task数量,也就代表了Spark作业的在各个阶段(stage)的并行度。
意义:
     假设,现在已经在spark-submit脚本里面,给我们的spark作业分配了足够多的资源,比如50个executor,每个executor有10G内存,每个executor有3个cpu core,基本已经达到了集群或者yarn队列的资源上限。
      task没有设置,或者设置的很少,比如就设置了100个task,50个executor每个executor有3个cpu core,也就是说你的Application任何一个stage运行的时候,都有总数在150个cpu core可以并行运行,但是你现在只有100个task,平均分配一下每个executor分配到2个task,那么同时在运行的task,只有100个每个executor只会并行运行2个task。每个executor剩下的一个cpu core,就浪费掉了。
     合理的并行度的设置应该是要设置的足够大,大到可以完全合理的利用你的集群资源,比如上面的例子总共集群有150个cpu core,可以并行运行150个task。那么就应该将你的Application的并行度,至少设置成150,才能完全有效的利用你的集群资源,让150个task并行执行,而且task增加到150个以后,即可以同时并行运行,还可以让每个task要处理的数据量变少;比如总共150G的数据要处理,如果是100个task,每个task计算1.5G的数据;现在增加到150个task,可以并行运行,而且每个task主要处理1G的数据就可以。
设置依据:
      1.task数量,至少设置成与Spark application的总cpu core数量相同(最理想情况,比如总共150个cpu core,分配了150个task,一起运行差不多同一时间运行完毕)。
      2.官方是推荐,task数量设置成spark application总cpu core数量的2~3倍,比如150个cpu core,基本要设置task数量为300~500。
      3.因为实际情况,与理想情况不同的,有些task会运行的快一点,比如50s就完了,有些task可能会慢一点,要1分半才运行完,所以如果你的task数量,刚好设置的跟cpu core数量相同,可能还是会导致资源的浪费,因为比如150个task,10个先运行完了,剩余140个还在运行,但是这个时候,有10个cpu core就空闲出来了,就导致了浪费。那如果task数量设置成cpu core总数的2~3倍,那么一个task运行完了以后,另一个task马上可以补上来,就尽量让cpu core不要空闲,同时也是尽量提升spark作业运行的效率和速度,提升性能。
如何设置一个Spark Application的并行度:
    spark.default.parallelism
    SparkConf conf = new SparkConf()
    conf.set("spark.default.parallelism", "500")