spark.shuffle.manager:hash、sort、tungsten-sort(本身實現內存管理)spark.shuffle.sort.bypassMergeThreshold:200
spark 1.2.x版本之後,默認的shuffle
manager,是什麼呢?
SortShuffleManager。性能
SortShuffleManager與HashShuffleManager兩點不一樣:
一、SortShuffleManager會對每一個reduce
task要處理的數據,進行排序(默認的)。
二、SortShuffleManager會避免像HashShuffleManager那樣,默認就去建立多份磁盤文件。一個task,只會寫入一個磁盤文件,不一樣reduce
task的數據,用offset來劃分界定。以前講解的一些調優的點,好比consolidateFiles機制、map端緩衝、reduce端內存佔比。
這些對任何shuffle manager都是有用的。大數據
總結:
如何來選擇?
一、需不須要數據默認就讓spark給你進行排序?就好像mapreduce,默認就是有按照key的排序。
若是不須要(不須要排序)的話,其實仍是建議搭建就使用最基本的HashShuffleManager,由於最開始就是考慮的是不排序,換取高性能;spa
二、何時須要用sort
shuffle manager?
若是你須要你的那些數據按key排序了,那麼就選擇這種吧,
並且要注意,reduce
task的數量應該是超過200的,這樣sort、merge(多個文件合併成一個)的機制,才能生效把。
可是這裏要注意,你必定要本身考量一下,有沒有必要在shuffle的過程當中,就作這個事情,畢竟對性能是有影響的。排序
三、若是你不須要排序,並且你但願你的每一個task輸出的文件最終是會合併成一份的,你本身認爲能夠減小性能開銷;
能夠去調節bypassMergeThreshold這個閾值,好比你的reduce
task數量是500,默認閾值是200,
因此默認仍是會進行sort和直接merge的;能夠將閾值調節成550,不會進行sort,按照hash的作法,每一個reduce
task建立一份輸出文件,最後合併成一份文件。
(必定要提醒你們,這個參數,其實咱們一般不會在生產環境裏去使用,也沒有通過驗證說,這樣的方式,到底有多少性能的提高)內存
四、若是你想選用sort
based shuffle manager,並且大家公司的spark版本比較高,是1.5.x版本的,那麼能夠考慮去嘗試使用tungsten-sort
shuffle manager。看看性能的提高與穩定性怎麼樣。hash
總結:
一、在生產環境中,不建議你們貿然使用第三點和第四點:二、若是你不想要你的數據在shuffle時排序,那麼就本身設置一下,用hash
shuffle manager。三、若是你的確是須要你的數據在shuffle時進行排序的,那麼就默認不用動,默認就是sort
shuffle manager;
或者是什麼?若是你壓根兒不care是否排序這個事兒,那麼就默認讓他就是sort的。調節一些其餘的參數(consolidation機制)。(80%,都是用這種)
spark.shuffle.manager:hash、sort、tungsten-sortnew內存管理
SparkConf().set("spark.shuffle.manager",
"hash")
new SparkConf().set("spark.shuffle.manager",
"tungsten-sort")// 默認就是,new
SparkConf().set("spark.shuffle.manager",
"sort")new SparkConf().set("spark.shuffle.sort.bypassMergeThreshold",
"550")
【兼顧合一,又不排序,性能較高】spark
大數據項目跟傳統的項目區別
50%代碼coding + 50%性能調優、troubleshooting、數據傾斜的解決。io
關注如下三點:sed
1.何時去調優? 2.怎麼調優? (看UI,調參數) 3.調優之後大體的效果如何?