Hive資料傾斜問題

2021-10-04 03:36:53 字數 1606 閱讀 8107

資料傾斜問題一直是大資料計算中普遍存在的現象,針對這種現象一般都是從兩方面解決,從資料本身和應用軟體進行優化。

由於hive中計算任務是轉化成mapreduce進行的,當sql執行緩慢或者某幾個reduce任務一直卡在99%時,說明資料有傾斜現象。根本原因就是資料在map或者reduce中分布不均勻,導致某幾個任務處理大量資料,大部分任務處理少量甚至沒有資料可處理,這就導致了資料傾斜,使得整個mapreduce任務執行緩慢。

hive中join操作分為common join和map join兩種,我們平時使用的就是common join。

common join是reduce端的join,在map階段按照join條件做為分割槽key,在shuffle階段按照key進行分割槽,最終各個分割槽資料進入對應的reduce中,然後再進行join計算。

map join是將join和計算過程放到了map端執行,先將較小的表載入到記憶體中,然後每個map中複製乙份資料,直接在本地與大表join計算,這樣減少了到reduce端資料傳輸,從而達到優化效果。

注意:map join通常適用於大表和小表join,因為資料在map記憶體中進行,所以兩張大表會超過記憶體限制。

1、設定hive.map.aggr=true。開啟map端聚合。

2、設定hive.groupby.skewindata=true。開啟map到reduce端自動負載均衡,它會啟動兩個mr job,第乙個job先將map輸出結果隨機分配到reduce中,先進行一波資料預處理,盡量減小資料量;第二個job再按照實際key正常分配到reduce,最終完成計算。

3、其他引數調整

hive.auto.convert.join=true。map join自動轉化,預設false

hive.mapjoin.smalltable.filesize/hive.smalltable.filesize=25000000。map join中小表閾值,閾值範圍內才進行map join,預設25m

hive.auto.convert.join.noconditionaltask=true。是否將多個map join合併為乙個,預設true

hive.auto.convert.join.noconditionaltask.size。多個map join合併為乙個的檔案大小總和,此引數需設定hive.auto.convert.join.noconditionaltask為true才生效

1、檢查sql語句是否合理,子查詢或關聯查詢是否可以優化,盡量想辦法將join表變小,能進行map join計算。

2、對於空值如果對計算結果沒有影響,可以填寫隨機值,保證資料負載均衡。

3、如果資料過於密集,例如key取值範圍是0-1000,但是資料集中在0-100,可以將key進行等倍數擴大,由0-100變成0-1000,使資料分散開。

4、對於表中重複或者無用資料先進行過濾再join統計。

5、關聯條件字段型別保持一致,保證相同key分配到同乙個map或reduce任務中。

6、如果未關聯部分資料比較多,且都集中在某幾個任務中,可以將這些關聯不上的key增加隨機值,讓資料盡可能分散開。

水平一般,能力有限,大資料小學生一枚。文章主要用於個人學習和總結,如果能給他人帶來幫助,純屬意外。

hive資料傾斜問題

背景 資料傾斜是大資料領域繞經常遇到的問題,當你所需處理的資料量到達了上億甚至是千億條的時候,資料傾斜將是橫在你面前一道巨大的坎,這也是大資料處理的乙個 的bug。最近在用hadoop跑批的時候經常遇到,一條hivesql要跑好久才能跑完。相信大部分做資料的童鞋們都會遇到資料傾斜,資料傾斜會發生在資...

Hive解決資料傾斜問題

簡單來說資料傾斜就是資料的key 的分化嚴重不均,造成一部分資料很多,一部分資料很少的局面。舉個 word count 的入門例子,它的map 階段就是形成 aaa 1 的形式,然後在reduce 階段進行 value 相加,得出 aaa 出現的次數。若進行 word count 的文字有100g,...

Hive解決資料傾斜問題

什麼是資料傾斜以及資料傾斜式怎麼產生的?簡單來說資料傾斜就是資料的key的分化嚴重不均,造成一部資料很多,一部分資料很少的局面。舉個 word count 的入門例子,它的map 階段就是形成 aaa 1 的形式,然後在reduce 階段進行 value 相加,得出 aaa 出現的次數。若進行 wo...