????????Spark并行度指在Spark作業(yè)中,各個Stage中task的數(shù)量,也就代表了Spark作業(yè)在各個階段的并行度。
合理設(shè)置并行度可以從以下幾個方面考慮:
- 1.充分利用任務(wù)資源,即并行度略高于分配給CPU資源數(shù)( = num-Executors * 每個Executor使用的core);
- 2.平均每個Partition的大小不要過于小,一般在百兆左右最合適;
- 3.根據(jù)實(shí)際機(jī)器分配給任務(wù)的資源和任務(wù)需要計算的數(shù)據(jù)量大小,再結(jié)合上面兩點(diǎn)進(jìn)行權(quán)衡設(shè)置。
????1.官方推薦:task數(shù)量,設(shè)置成Spark Application總CPU core數(shù)量的2~3倍,同時盡量提升Spark運(yùn)行效率和速度;
????2.spark.default.paralleism默認(rèn)是沒有值的,如果設(shè)置了值,比如10,是在Shuffle中才會起作用。如:val rdd1 = rdd2.reduceByKey(_ + ),rdd2的分區(qū)數(shù)為10,rdd1的分區(qū)數(shù)不受這個參數(shù)影響;
????3.如果讀取的數(shù)據(jù)在HDFS上,增加block數(shù),默認(rèn)情況下split與block是一對一的,而split又與RDD中的Partition對應(yīng),所以增加了block數(shù),也就提高了并行度;
????4.reduceByKey的算子指定Partition的數(shù)量;如val rdd2 = rdd1.reduceByKey( + _, 10);
????5.val rdd3 = rdd1.join(rdd2),rdd3里Partition的數(shù)量由父rdd中最多的Partition數(shù)量決定,因此使用join算子時,應(yīng)增加父rdd中的Partition數(shù)量;
????6.設(shè)置spark.sql.shuffle.partition,配置Spark SQL中shuffle過程中Partition的數(shù)量。