1. 什么是數據傾斜?
????????在分布式計算場景下,大量的數據集中在某一個節點而導致一個任務的執行時間變長。而大量的節點只處理了小部分的數據,大數據組件處理海量數據的特點就是不患多,而患不均。
2. 怎么發現任務出現了數據傾斜現象
????????在yarn上可以查看task的執行情況,如果一個階段中有些task很快執行完了,有些task遲遲無法結束或者運行時間減少,則大概率出現了數據傾斜的現象。
3. 描述1個數據傾斜的情景,針對這個情景給出解決方案
情景1:select count(distinct user_id) from t_user;
為什么:如果存在大量相同的user_id,而在count的時候會因為大量相同的user_id集中在同一個reducetask中,導致數據傾斜
解決方案:
1) 設置提高reduceTask的個數
2) select count(*) from(select sex from t_person group by sex) t1;
情景2:在group by分組的時候,某個key過多;
解決方案:將 key 打散
-
給 key 增加隨機前綴
在進行
group by
之前,先給每個user_id
增加一個隨機前綴,使得原本相同的user_id
被打散到不同的分組中。 -
按帶前綴的 key 進行分組
對帶有隨機前綴的
user_id
進行分組和聚合。 -
去掉前綴后再分組
在第一步的基礎上,去掉前綴,再進行一次分組和聚合,得到最終的結果。