7 Hive數據傾斜及處理

Hive數據傾斜及處理

① 數據傾斜的概念及原因

1.1 數據傾斜

    數據傾斜就是數據的分佈不平衡,某些地方特別多,某些地方又特別少,導致的在處理數據的時候,有些很快就處理完了,而有些又遲遲未能處理完,導致整體任務最終遲遲無法完成,這種現象就是數據傾斜。

    針對mapreduce的過程來說就是,有多個reduce,其中有一個或者若干個reduce要處理的數據量特別大,而其他的reduce處理的數據量則比較小,那麼這些數據量小的reduce很快就可以完成,而數據量大的則需要很多時間,導致整個任務一直在等它而遲遲無法完成。

跑mr任務時常見的reduce的進度總是卡在99%,這種現象很大可能就是數據傾斜造成的。

1.2 產生數據傾斜的原因
  • key分佈不均勻

    上面就說過,數據傾斜是因爲reduce的數據量大小差異過大,而reduce的數據是分區的結果,分區是對key求hash值,根據hash值決定該key被分到某個分區,進而進入到某個reduce,而如果key很集中或者相同,那麼計算得到它們的hash值可能一樣,那麼就會被分配到同一個reduce,就會造成這個reduce所要處理的數據量過大。

  • 業務數據本身的特性

     比如某些業務數據作爲key的字段本就很集中,那麼結果肯定會導致數據傾斜啊。

    還有其他的一些原因,但是,根本原因還是key的分佈不均勻,而其他的原因就是會造成key不均勻,進而導致數據傾斜的後果,所以說根本原因是key的分佈不均勻。

1.3 數據傾斜的表現

  • 任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因爲其處理的數據量和其他reduce差異過大。
  • 單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大於平均時長。

 

② 數據傾斜的解決辦法

2.1 設置參數

hive.map.aggr = true    // Map 端部分聚合,相當於Combiner;

hive.groupby.skewindata=true    //

有數據傾斜的時候進行負載均衡,當選項設定爲 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分佈到 Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group By Key 分佈到 Reduce 中(這個過程可以保證相同的 Group By Key 被分佈到同一個 Reduce 中),最後完成最終的聚合操作。

2.2 SQL語句優化

  •  大小表join

使用map join讓小的維度表(1000條以下的記錄條數) 先進內存。在map端完成reduce。

  • 大表Join大表

把空值的key變成一個字符串加上隨機數,把傾斜的數據分到不同的reduce上,由於null值關聯不上,處理後並不影響最終結果。

  • count distinct大量相同特殊值

count distinct時,將值爲空的情況單獨處理,如果是計算count distinct,可以不用處理,直接過濾,在最後結果中加1。如果還有其他計算,需要進行group by,可以先將值爲空的記錄單獨處理,再和其他計算結果進行union。

  • 特殊情況特殊處理

在業務邏輯優化效果的不大情況下,有些時候是可以將傾斜的數據單獨拿出來處理。最後union回去。

 

參考鏈接:https://www.jianshu.com/p/42be5ca8b11d

參考鏈接:https://blog.csdn.net/xinzhi8/article/details/71455883

參考鏈接:https://blog.csdn.net/qq_35036995/article/details/80298403

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章