在实际开发中,spark集群的资源不一定会被充分的利用到,所以尽量设置合理的并行度来充分的利用集群的资源。才能充分提高spark应用程序的性能。
spark会自动设置以文件作为输入源的RDD的并行度,依据其大小,比如hdfs就会给每一个block创建一个partition,也依据这个设置并行度。对于reduceByKey等会发生的shuffle的操作就使用并行度最大的父RDD的并行度即可。
可以动手使用textFile(),parallelize()等方法的第二个参数来设置并行度;也可以使用spark.default.partition参数,来设置统一的并行度,spark官方的推荐是给每个集群中的cpu core设置2-3个task.
比如说spark-submit 设置了executor数量是10个,每个executor要求分配两个core,那么application总共会有20个core此时可以new sparkconf().set(“spark.default.parallelism”,”60”)来设置合理的并行度从而充分利用资源
下面举个例子
在spark-submit中配置了2个executor每个executor有5个cpu。new SparkConf().set(“spark.default.parallelism”,”5”) 这个参数一旦设置了就是说所有的RDD的partition都被设置成了5个也就是说每个RDD的数据,会被拆为5份,那么针对RDD的partition,一个partition会启动一个task来进行计算。所以针对于所有的算子操作。都只会创建5个task,在集群中运行.
所以在这个时候集群中有10个core但是被设置成了5个task。那么相当于集群中有5个cpu core是空闲的 资源被白白浪费了,
其实最好的情况就是说,每个cpu都不空闲,一直在不断的运转着,那么这时候对集群的资源的使用率是最高的。
我们还不一定只设置成10个task让每个cpu 一个task 完全可以设置 20个到30个task。因为每个task的执行循序是不一样的那么刚好10个task可能某个task 很快就执行完了那么那个cpu 又空闲下来了资源又浪费了。所以spark 官方推荐设置集群cpu 的2-3倍的task。