spark 性能调优 项目中调节并行度

Spark Word Count 示例

每个Spark作业其实都是一个 Application,每个 Application 对应多个 Jobs,一个 action 操作(比如 collect)触发一个 job,在WordCount程序中有一个 job,每个 job 拆成多个 stage(发生 shuffle 的时候回拆分出一个 stage),reduceByKey 处会发生 shuffle。

spark 性能调优 项目中调节并行度_第1张图片

具体调节并行度

1、什么是并行度?
Spark作业中,各个stage的task数量,就代表Spark作业在各个阶段(stage)的并行度
2、为什么要调节并行度?
如果不调节并行度,导致并行度过低,会导致什么?
假设,现在 spark-submit脚本里,给我们spark作业分配了足够多的资源,比如50个excutor ,每个excutor有10g内存,每个excutor,有3个core,基本达到集群或者yarn队列的资源上限。
task没有设置,或者设置的很少,比如就设置了100个task.50个excutor,每个excutor有3个cpu core,也就是说,Application任何一个stage运行时,都有总数在150个cpu core,可以并行运行。但是只有100个task,平均分配,每个excutor分配2个task,那么导致每个excutor 剩余一个cpu core 浪费资源
资源虽然足够,但是并行度没有与资源相匹配,导致分配下去资源浪费掉

合理的并行度的设置,应该是要设置的足够大,达到可以完全力合理利用集群资源,集群总共有150个cpu core,可以并行运行150个task.那么久应该将Application的并行度,至少设置成150,才能完全利用集群资源,让150个task并行执行;而且150个以后,既可以同时并行运行,还可以让每个task要处理的数据量变少;比如总共150G的数据要处理,如果是100个task,每个task计算1.5G的数据;现在增加到150个task,可以并行运行,而且每个task主要处理1G的数据就可以。

3、如何提高并行度?

  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,可能会比较慢一点
    需要一分钟多才结束,如果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")

你可能感兴趣的:(实战)