sparksql 在執行複雜資料查詢的時候很容易出現一些資料傾斜情況如下圖,開啟spark ui 發現最慢的stage29 其中乙個task 巨慢,即使設定了較多的資源依然執行時間超過了60min,通常情況下我們在不看這些資料的情況下本能的調大spark shuffle的並行度,但也不是百試百靈的,對於資料本身沒有傾斜,而task處理資料不均的,使用此種方法是很有效果的。
但是我們這裡討論的是資料本身存在的傾斜問題,該如何去定位分析呢?
以下是ui 的部分截圖,顯示其中乙個task拖慢了整個任務的進度,最後由於executor記憶體爆掉而被yarn無奈乾掉,諸如容器被標記失敗,退出**143等。
當新增資源沒喲效果的時候,可以明顯想到勢必是資料傾斜了,如下對於某個關聯的字段發現null值驚人的達到4千多萬,如下:
select first_les_sel_id,count(1) from tmp.tmp_stu***_20201209 group by first_les_sel_id order by count(1) desc limit 10;
first_les_sel_id count(1)
null 45506549
50245 10808
36840 10496
55592 9815
31346 9782
51114 9765
60825 9712
55693 9474
64798 9348
61695 9325
這類問題既然找到了很好解決:
1、過濾無意義的null值
2、雖為null值但是無法過濾,那就只能採用隨機打散策略了
過濾很簡單,且不說,如何隨機打散呢?
---參考你可以如上所示進行打散, 這使得原執行時間從80分鐘+ 直接降到9分鐘跑完,效果還是很明顯的。對於spark來說,不怕資料多就怕資料傾斜。select t1.first_les_sel_id,t6.sel_id
from tmp.tmp_sf_20201209 as t1
left join
(select
sel_id,
sel_name,
sel_employee_id,
sel_entry_time,
sel_resigned_time,
sel_identity,
sel_team,
sel_team_region,
sel_district,
if(sel_is_new > 0 ,'新人','老人') as sel_is_new,
case sel_grade when 0 then 's'
when 1 then 'aaa'
when 2 then 'aa'
when 3 then 'a'
when 4 then 'b'
when 5 then 'c'
when 6 then 'd'
else sel_grade end as sel_grade,
belong_date
from
dim.dim_sr_info_history_df
where
pt = '2020-12-09'
) as t6
on case when t1.first_les_sel_id is null then concat ('0000',substr(rand()*100,1,2)) else t1.first_les_sel_id end = t6.sel_id
除上面這種寫法之外還有乙個切實可行的辦法,在所選擇的列中新增冗餘列,你可以使用colease函式去處理null,盡可能雜湊開就完美了
參考:如有幫到你,不妨點個?,thanks♪(・ω・)ノ
Spark優化總結(一) 資料傾斜
舉例 hive分桶導致的資料傾斜 舉例 kafka分割槽導致的資料傾斜 舉例 hive分桶 kafka分割槽 舉例 分布式mpp架構資料庫 另外,即便不是分布式資料庫,如果你的資料庫只有乙個節點可用,同樣會造成該問題 舉例 hbase的rowkey設計錯誤 簡約示意圖 資料原狀態 node1 nod...
解決 spark 中的資料傾斜問題
發現資料傾斜的時候,不要急於提高 executor 的資源,修改引數 或是修改程式,首先要檢查資料本身,是否存在異常資料。1 資料問題造成的資料傾斜 找出異常的 key 如果任務長時間卡在最後最後 1 個 幾個 任務,首先要對 key 進行 抽樣分析,判斷是哪些 key 造成的。選取 key,對資料...
解決spark中遇到的資料傾斜問題
多數task執行速度較快,少數task執行時間非常長,或者等待很長時間後提示你記憶體不足,執行失敗。常見於各種shuffle操作,例如reducebykey,groupbykey,join等操作。key本身分布不均勻 包括大量的key為空 key的設定不合理 shuffle時的併發度不夠 計算方式有...