參考:
資料傾斜發生的原理
資料傾斜的原理很簡單:在進行shuffle的時候,必須將各個節點上相同的key拉取到某個節點上的乙個task來進行處理,比如按照key進行聚合或join等操作。此時如果某個key對應的資料量特別大的話,就會發生資料傾斜。比如大部分key對應10條資料,但是個別key卻對應了100萬條資料,那麼大部分task可能就只會分配到10條資料,然後1秒鐘就執行完了;但是個別task可能分配到了100萬資料,要執行一兩個小時。因此,整個spark作業的執行進度是由執行時間最長的那個task決定的。
下圖就是乙個很清晰的例子:hello這個key,在三個節點上對應了總共7條資料,這些資料都會被拉取到同乙個task中進行處理;而world和you這兩個key分別才對應1條資料,所以另外兩個task只要分別處理1條資料即可。此時第乙個task的執行時間可能是另外兩個task的7倍,而整個stage的執行速度也由執行最慢的那個task所決定。
解決方案一:使用hive etl預處理資料
我理解為分區分桶
解決方案二:過濾少數導致傾斜的key
過來一些資料
方案適用場景:如果發現導致傾斜的key就少數幾個,而且對計算本身的影響並不大的話,那麼很適合使用這種方案。比如99%的key就對應10條資料,但是只有乙個key對應了100萬資料,從而導致了資料傾斜。
解決方案三:提高shuffle操作的並行度
方案適用場景:如果我們必須要對資料傾斜迎難而上,那麼建議優先使用這種方案,因為這是處理資料傾斜最簡單的一種方案。
調大reduce 的數量
解決方案四:兩階段聚合(區域性聚合+全域性聚合)
我理解為 給key前增加隨機數,切分的時候就可以打散
方案實現原理:將原本相同的key通過附加隨機字首的方式,變成多個不同的key,就可以讓原本被乙個task處理的資料分散到多個task上去做區域性聚合,進而解決單個task處理資料量過多的問題。接著去除掉隨機字首,再次進行全域性聚合,就可以得到最終的結果。具體原理見下圖。
解決方案五:將reduce join轉為map join
只適用於乙個大表和乙個小表的情況,不會發生shuffle,也就根本不會發生資料傾斜
方案缺點:適用場景較少,因為這個方案只適用於乙個大表和乙個小表的情況。畢竟我們需要將小表進行廣播,此時會比較消耗記憶體資源,driver和每個executor記憶體中都會駐留乙份小rdd的全量資料。如果我們廣播出去的rdd資料比較大,比如10g以上,那麼就可能發生記憶體溢位了。因此並不適合兩個都是大表的情況。
解決方案六:取樣傾斜key並分拆join操作
方案實現思路:
對包含少數幾個資料量過大的key的那個rdd,通過sample運算元取樣出乙份樣本來,然後統計一下每個key的數量,計算出來資料量最大的是哪幾個key。
然後將這幾個key對應的資料從原來的rdd中拆分出來,形成乙個單獨的rdd,並給每個key都打上n以內的隨機數作為字首,而不會導致傾斜的大部分key形成另外乙個rdd
解決方案七:使用隨機字首和擴容rdd進行join
方案適用場景:如果在進行join操作時,rdd中有大量的key導致資料傾斜,那麼進行分拆key也沒什麼意義,此時就只能使用最後一種方案來解決問題了。
方案實現思路:
該方案的實現思路基本和「解決方案六」類似,首先檢視rdd/hive表中的資料分布情況,找到那個造成資料傾斜的rdd/hive表,比如有多個key都對應了超過1萬條資料。
然後將該rdd的每條資料都打上乙個n以內的隨機字首。
同時對另外乙個正常的rdd進行擴容,將每條資料都擴容成n條資料,擴容出來的每條資料都依次打上乙個0~n的字首。
最後將兩個處理後的rdd進行join即可。
spark資料傾斜問題
資料傾斜 加更大記憶體 跟cpu硬體是效能優化的根本之道 一 資料傾斜帶來的致命性後果 1.oom 根本原因資料太多 一般oom都是由於資料傾斜所致,spark基於jvm之上的 2.速度非常慢 二 資料傾斜的基本特徵 1.任務分配不均勻 2.個別task處理過度大量的資料 shuffle過程中遇到同...
解決 spark 中的資料傾斜問題
發現資料傾斜的時候,不要急於提高 executor 的資源,修改引數 或是修改程式,首先要檢查資料本身,是否存在異常資料。1 資料問題造成的資料傾斜 找出異常的 key 如果任務長時間卡在最後最後 1 個 幾個 任務,首先要對 key 進行 抽樣分析,判斷是哪些 key 造成的。選取 key,對資料...
解決spark中遇到的資料傾斜問題
多數task執行速度較快,少數task執行時間非常長,或者等待很長時間後提示你記憶體不足,執行失敗。常見於各種shuffle操作,例如reducebykey,groupbykey,join等操作。key本身分布不均勻 包括大量的key為空 key的設定不合理 shuffle時的併發度不夠 計算方式有...