Spark 性能调优之并行度设置

Spark 性能调优之并行度设置

Spark 作业中的并行度


  1. 什么是并行度

Spark 在每一个 stage 中 task 数量,就称为这个 stage 上的并行度;

  1. 为什么要设置并行度

如果你按照集群能给的最大资源给当前 Spark 应用分配资源,但是你的并行度却没有达到你分配的资源,没有充分利用资源;

假设:

现在已经在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个task,每个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. 一个Spark作业的并行度设置为多少才好?

    • task数量,至少设置成与spark Application 的总cpu core 数量相同; 官方推荐,task数量,设置成spark Application
      总cpu core数量的2~3倍 ,比如150个cpu core ,基本设置 task数量为 300~ 500. 因为有些 task 会快一点,为了让 cpu core 不要空闲,所以设置成 task 数量比 cpu core多;
  2. 如何设置并行度

  • spark.defalut.parallelism 默认是没有值的,如果设置了值比如说10,是在shuffle的过程才会起作用
  • reduceByKey 的算子指定partition的数量
  • RDD.repartition,给RDD重新设置partition的数量
  • spark.sql.shuffle.partitions //spark sql中shuffle过程中partitions的数量

总结

在分配完足够的资源的情况下,需要调节合适的并行才能充分利用资源,提供Spark作业的效率;因此,合理的设置并行度是至关重要的;
Spark官方推荐的并行度数量为,Spark Application 总 CPU core 数量的 2~3 倍;

你可能感兴趣的:(Spark,spark,大数据)