spark 并行度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spark 并行度相关的知识,希望对你有一定的参考价值。

参考技术A 并行度的解释:

并行度:是 一个spark应用中,每个stage之中的task的数目。

什么是task:

一个spark应用任务执行的最基本单位。

还有语义比较相近的配置参数:

在提交spark 应用的时候,会进行配置的参数

--num-execuotrs 应用启动的executor的数量

--executor-cores 每个executor之中core的数量。

可以将 core 看成是一个空位,task 看成是一个人,

这里的设置的意思就是,有两个executor 每个executor上面有 2个core,

表示每次可以坐四个人,也就是可以跑4个task。

那么问题来了:

1:如何设置并行度?

2:并行度的设置 在多少较为合适?

3:如果不设置并行度,那么并行度由谁来决定?

问题1:

在sparkConf之中进行并行度的配置

问题2:

并行度的设置一般在 core * executor * (2或者3之间)。

(executor的数量 乘上 core的数量 再乘上 2到3)

并行度不是越大越好,并行度太大的话,可能会造成任务空跑,这样就白白浪费了时间和资源。

问题3:

rdd之中的分区的数目,就会称为应用的并行度。

一个RDD之中的一个partition 对应一个task任务。RDD之中由多少个分区,

那么就会相应地生成多少个task。

一个小注意点:

这里的并行度的设置 是spark core 这个模块的。

对于spark sql 可能不起作用。

然后 executor的数量和core的数量 的设置,就是需要看具体的机器配置,以及愿意给这个任务多少资源去跑。

所以,并行度决定了task的数量,但是值得注意的就是,如果task的数目太多,

可能某个task之中并没有数据,task只是空跑。

spark调优:调节并行度

并行度:其实就是指的是,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,ok,那么同时在运行的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的数据就可以。

很简单的道理,只要合理设置并行度,就可以完全充分利用你的集群计算资源,并且减少每个task要处理的数据量,最终,就是提升你的整个Spark作业的性能和运行速度。

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;

实际情况,与理想情况不同的,有些task会运行的快一点,比如50s就完了,有些task,可能会慢一点,要1分半才运行完,所以如果你的task数量,刚好设置的跟cpu core数量相同,可能还是会导致资源的浪费,因为,比如150个task,10个先运行完了,剩余140个还在运行,但是这个时候,有10个cpu core就空闲出来了,就导致了浪费。那如果task数量设置成cpu core总数的2~3倍,那么一个task运行完了以后,另一个task马上可以补上来,就尽量让cpu core不要空闲,同时也是尽量提升spark作业运行的效率和速度,提升性能。

3、如何设置一个Spark Application的并行度?
spark.default.parallelism
SparkConf conf = new SparkConf()
  .set("spark.default.parallelism", "500")

“重剑无锋”:真正有分量的一些技术和点,其实都是看起来比较平凡,看起来没有那么“炫酷”,但是其实是你每次写完一个spark作业,进入性能调优阶段的时候,应该优先调节的事情,就是这些(大部分时候,可能资源和并行度到位了,spark作业就很快了,几分钟就跑完了)

“炫酷”:数据倾斜(100个spark作业,最多10个会出现真正严重的数据倾斜问题),感冒和发烧,你不能上来就用一些偏方(癌症,用癞蛤蟆熬煮汤药);JVM调优;

以上是关于spark 并行度的主要内容,如果未能解决你的问题,请参考以下文章

spark 并行度

Spark---并行度和分区

Spark性能调优之合理设置并行度

Spark性能调优之合理设置并行度

spark调优:调节并行度

spark调优:调节并行度