1.傾斜的原因:
map輸出資料按key Hash 的分配到reduce中,由于key的分布不均勻,業務資料本身的特性,
建表的時候考慮不周.等原因造成的reduce上的資料量差異過大.
(1).key分布的不均勻;
(2).業務資料本身的特性;
(3).建表的時候考慮不周;
(4).某些SQL陳述句本身就有資料傾斜
如何避免:對key為空產生的資料傾斜,可以對其賦予一個隨機值.
2.解決方案
(1) 引數調節"
hive.map.aggr=true
hive.groupby.skewindata=https://bbs.csdn.net/topics/true
有資料傾斜的時候進行負載均衡,當選項設定位true,生成的查詢計劃會有兩個MR JOB.
第一個MR Job中,Map的輸出結果集合會隨機分布到Reduce中,每個Reduce做部分的聚合操作,
并輸出結果,這樣處理的結果是相同的Group BY Key 有可能被分發到不同的Reduce中,從而達倒,
負載均衡的目的;第二個MR Job 再根據預處理的資料結果按照Group By Key分布到Reduce中(這個
程序可以保證相同的Group BY Key 被分配到同一個Reduce中),最后完成最終的聚合操作.
(2)SQL陳述句調節:
1)選用join key 分布最均勻的表作為驅動表.做好列裁剪和filter操作,以達到兩表做join的時候,
資料量相對變小的效果
2)大小表Join:
使用map join 讓小的維度表(1000條一下的記錄條數)先進記憶體.在map端完成reduce.
3)大表Join大表:
把空值的key變成一個字串加上亂數,把傾斜的資料分到不同的reduce上,由于null值關聯不上,
處理后并不影響最終結果.
4)count distinct 大量相同特殊值
count distinct時,將值為空的情況單獨處理,如果是計算count distinct,可以不用處理,直接過濾,
在最后的結果加1,如果還有其他計算,需要進行group by, 可以先將值為空的記錄單獨處理,再和
其他計算結果進行union.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/43433.html
標籤:數據倉庫
上一篇:騰訊云ubuntu的mysql沒法遠程訪問啊?怎么辦
下一篇:安裝包出現亂碼
