1.現象
數據傾斜是進行大數據計算時最經常遇到的問題之一。當我們在執行hiveql或者運行mapreduce作業時候,如果遇到一直卡在map100%,reduce99%,查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因爲其處理的數據量和其他reduce差異過大。一般就是遇到了數據傾斜的問題。數據傾斜其實是進行分佈式計算的時候,某些節點的計算能力比較強或者需要計算的數據比較少,早早執行完了,某些節點計算的能力較差或者由於此節點需要計算的數據比較多,導致出現其他節點的reduce階段任務執行完成,但是這種節點的數據處理任務還沒有執行完成。
2.產生原因
1)key分佈不均勻
2)業務數據本身的特性
3)建表時考慮不周
4)某些sql語句本身就有數據傾斜,如下表所示:
關鍵詞 |
情形 |
後果 |
join |
中一個表較小,但是key集中 |
分發到某一個或幾個reduce上的數據遠高於平均值 |
join |
大表與大表,但是分桶的判斷字段0值或空值過多 |
這些空值都由一個reduce處理,非常慢 |
group by |
group by 維度過小,某值的數量過多 |
處理某值的reduce灰常耗時 |
count distinct |
某特殊值過多 |
處理此特殊值reduce耗時 |
(待完善)