????????Spark并行度指在Spark作業(yè)中枫匾,各個Stage中task的數(shù)量,也就代表了Spark作業(yè)在各個階段的并行度濒蒋。
合理設(shè)置并行度可以從以下幾個方面考慮:
- 1.充分利用任務(wù)資源,即并行度略高于分配給CPU資源數(shù)( = num-Executors * 每個Executor使用的core);
- 2.平均每個Partition的大小不要過于小蹦掐,一般在百兆左右最合適;
- 3.根據(jù)實際機器分配給任務(wù)的資源和任務(wù)需要計算的數(shù)據(jù)量大小僵闯,再結(jié)合上面兩點進行權(quán)衡設(shè)置卧抗。
????1.官方推薦:task數(shù)量,設(shè)置成Spark Application總CPU core數(shù)量的2~3倍鳖粟,同時盡量提升Spark運行效率和速度社裆;
????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ù)量庆杜。