您的位置:首页 > 其它

性能调优之在实际项目中调节并行度

2016-08-31 23:58 295 查看
Spark 并行度指的是什么?

Spark作业,Application Jobs action(collect)触发一个job;

每个job 拆成多个stage, 怎么划分: 发生shuffle的时候,会拆分出一个stage;(怎么会发生shuffle?)

stage0 stage1

WordCount

val lines = sc.textFile(“hdfs://”)

val words = lines.flatMap(_.split(” “))

val pair = words.map((_,1))

val wordCount = pair.reduceByKey(+)

wordCount.collect()

的reduceByKey stage0的task 在最后,执行到reduceByKey 的时候,会为每个stage1的task 都创建一份文件,(也可能是合并在少量的文件里面),

每个tage1的task回去各个节点上的task创建的属于自己那一份 文件里面,拉去数据;

每个stage1 的task ,拉取到的数据,一定是相同key对应的数据,对相同的key,对应的values,才能去执行我们自定义的function操作(+)

1.每一个file里面,一定存放相同的key对应的values;

2.但是一个文件里面可能有多个key,以及对应values

3.想呕吐那个key的values一定是进入同一个文件。

并行度:

其实就是spark作业中,各个stage的task的数量,也就代表了spark作业在各个阶段stage的并行度!

如果不调节并行度,导致并行度过低,会怎么样?

假如, 现在已经在spark-submit 脚本里面,给我们的spark作业分配了足够多的资源,比如50个executor ,每个executor 有10G内存,每个executor有3个cpu core 。 基本已经达到了集群或者yarn队列的资源上限。

task没有设置,或者设置的很少,比如就设置了,100个task 。 50个executor ,每个executor 有3个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处理数据量,而增加性能加快运行速度。

1.task数量,至少设置成与spark Application 的总cpu core 数量相同(最理性情况,150个core,分配150task,一起运行,差不多同一时间运行完毕)

2.官方推荐,task数量,设置成spark Application 总cpu core数量的2~3倍 ,比如150个cpu core ,基本设置 task数量为 300~ 500.

与理性情况不同的,有些task 会运行快一点,比如50s 就完了,有些task 可能会慢一点,要一分半才运行完,所以如果你的task数量,刚好设置的跟cpu core 数量相同,可能会导致

资源的浪费,因为 比如150task ,10个先运行完了,剩余140个还在运行,但是这个时候,就有10个cpu core空闲出来了,导致浪费。

如果设置2~3倍,那么一个task运行完以后,另外一个task马上补上来,尽量让cpu core不要空闲。同时尽量提升spark运行效率和速度。提升性能。

3.如果设置一个spark Application 的并行度“?

spark.defalut.parallelism

new SparkCofn().set(“spark.defalut.parallelism”,”“500)

重剑无锋。真正有分量 的一些技术和点,其实都是看起来比较平凡,看起来没有那么炫酷。但是其实是你每次写完一个spark作业,进入性能调优阶段的时候,应该优先调节的事情,就是这些

(大部分时候吗,可能资源和并行度到位了,spark作业就很快了,几分钟就完了。)

炫酷:

数据倾斜(100个spark 作业,最多10个会出现真正严重的数据倾斜问题) 。感冒和发烧,你不能上来就用一些偏方。

akka jvm 数据倾斜

比如调了一周 jvm参数, 却只快了30秒,不如开发一个新模块。!

特别严重的数据倾斜,full gc ,oom!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spark 性能