55、Spark性能优化之提高并行度

55、Spark性能优化之提高并行度_第1张图片
提高并行度原理.png

spark-submit里,配置了两个Executor,每个Executor,有5个cpu core
val conf = new SparkConf().setAppName("WordCount").set("spark.default.parallelism", "5")
这个参数一旦设置了,也就是,所有的RDD的partition都被设置成了5个,也就是说每个RDD的数据,会被拆成5份,那么,针对RDD的partition,一个partition,会启动一个task来进行计算,所以,对于所有的算子操作,都只会创建5个task,在集群中运行
但是,集群中,明明有10个cpu core,结果程序设置成了5个task,那么,有5个cpu core是空闲的,资源就被白白浪费了
其实,最好的情况是,每个cpu core都不空闲,一直在不断运转着,那么这个时候我们对集群的资源利用率是最高的,也意味着我们的sparl Application的性能使最高的
其实,我们完全可以设置20-30个task,而不仅仅只设置10个task,因为每个task执行的顺序和完成的时间可能是不一样的,那么如果正好是10个task,可能某个task很快就完成了,那么那个cpu就又空闲下来了,资源又浪费了
Spark官方推荐,设置集群总CPU数量的两倍到三倍的并行度,这样,每个cpu core可能分配到并发运行2到3个task线程,那么集群资源就不太可能出现空闲的情况,会连续运转,最大发挥出来集群的功效来

提高并行度

实际上Spark集群的资源并不一定会被充分利用到,所以要尽量设置合理的并行度,来充分地利用集群的资源。才能充分提高Spark应用程序的性能。
Spark会自动设置以文件作为输入源的RDD的并行度,依据其大小,比如HDFS,就会给每一个block创建一个partition,也依据这个设置并行度。对于reduceByKey等会发生shuffle的操作,就使用并行度最大的父RDD的并行度即可。
可以手动使用textFile()、parallelize()等方法的第二个参数来设置并行度;也可以使用spark.default.parallelism参数,来设置统一的并行度。Spark官方的推荐是,给集群中的每个cpu core设置2~3个task。
比如说,spark-submit设置了executor数量是10个,每个executor要求分配2个core,那么application总共会有20个core。此时可以设置new SparkConf().set("spark.default.parallelism", "60")来设置合理的并行度,从而充分利用资源。

你可能感兴趣的:(55、Spark性能优化之提高并行度)