谈谈spark.sql.shuffle.partitions和 spark.default.parallelism 的区别及spark并行度的理解
談談spark.sql.shuffle.partitions和 spark.default.parallelism 的區別及spark并行度的理解
- spark.sql.shuffle.partitions和 spark.default.parallelism 的區別
- spark并行度的理解
- 如何設置spark.sql.shuffle.partitions和spark.default.parallelism的值
spark.sql.shuffle.partitions和 spark.default.parallelism 的區別
首先兩者最直觀的區別:
?spark.default.parallelism只有在處理RDD時有效.
?spark.sql.shuffle.partitions則是只對SparkSQL有效.
看一下官網給出的兩者定義:
以我的四級水準亂翻譯一下:
?spark.sql.shuffle.partitions: 設置的是?RDD1做shuffle處理后生成的結果RDD2的分區數.
??默認值: 200
?spark.default.parallelism: 設置的是?RDD1做shuffle處理/并行處理(窄依賴算子)后生成的結果RDD2的分區數
??默認值:
???對于分布式的shuffle算子, 默認值使用了結果RDD2所依賴的所有父RDD中分區數最大的, 作為自己的分區數.
???對于并行處理算子(窄依賴的), 有父依賴的, 結果RDD分區數=父RDD分區數, 沒有父依賴的看集群配置:
????Local mode:給定的core個數
????Mesos fine grained mode: 8
????Others: max(RDD分區數為總core數, 2)
spark并行度的理解
?并行度其實就是指的是spark作業中, 各個stage的taskset中的task的數量, 代表了spark作業中各個階段的并行度, 而taskset中的task數量 = task任務的父RDD中分區數
如何設置spark.sql.shuffle.partitions和spark.default.parallelism的值
?官網建議: 設置為當前spark job的總core數量的2~3倍. 理由如下:
?背景: spark作業是 1 core 1 task的
?假設我們給當前Spark job 設置總Core數為 100, 那么依據1 core 1 task, 當前spark集群中最多并行運行100task任務, 那么通過設置上述兩個參數為100, 使得我們結果RDD的分區數為100, 一個分區 1task 1core, 完美! 但是實際生產中會有這樣的情況, 100個task中有些task的處理速度快, 有些處理慢, 假設有20個task很快就處理完畢了, 此時就會出現 我們集群中有20個core處理閑置狀態, 不符合spark官網所說的最大化壓榨集群能力.
?而如果我們設置上述參數值為199, 此時的現象: 雖然集群能并行處理199個task, 奈何總core只有100, 所以會出現有99個task處于等待處理的情況. 處理較快的那20task閑置下來的20個core就可以接著運行99個中的20個task, 這樣就最大化spark集群的計算能力
總結
以上是生活随笔為你收集整理的谈谈spark.sql.shuffle.partitions和 spark.default.parallelism 的区别及spark并行度的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 磁盘的顺序读写与随机读写详解
- 下一篇: HBase的布隆过滤器详解