Hive - hive.groupby.skewindata環境變量與負載均衡

HiveQL 去重操作

和SQL一樣,HiveQL中同樣支持DISTINCT操作,如下示例:

(1) SELECT count(DISTINCT uid) FROM log

(2) SELECT ip, count(DISTINCT uid) FROM log GROUP BY ip
(3) SELECT ip, count(DISTINCT uid, uname) FROM log GROUP BY ip
(4) SELECT ip, count(DISTINCT uid), count(DISTINCT uname) FROM log GROUP BY ip


當我們使用Hive QL中的去重關鍵字DISTINCT時,需要注意的一點是:在多個列上進行的去重操作與hive環境變量hive.groupby.skewindata存在關係當hive.groupby.skewindata=true時,hive不支持多列上的去重操作,並報錯:Error in semantic analysis: DISTINCT on different columns not supported with skew in data. 注意:上面示例中的(3)不屬於多列上的DISTINCT操作。Group By 語句

Map 端部分聚合:

並不是所有的聚合操作都需要在 Reduce 端完成,很多聚合操作都可以先在 Map 端進行部分聚合,最後在 Reduce 端得出最終結果。

基於 Hash參數包括:

hive.map.aggr = true是否在 Map 端進行聚合,默認爲 True

hive.groupby.mapaggr.checkinterval = 100000在 Map 端進行聚合操作的條目數目

有數據傾斜的時候進行負載均衡

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



hive.groupby.skewindata 變量

從上面group by語句可以看出,這個變量是用於控制負載均衡的。當數據出現傾斜時,如果該變量設置爲true,那麼Hive會自動進行負載均衡。

HIVE-2416

Currently when multiple distinct function is used, hive.groupby.skewindata optimization parameter shall be set false, or else an exception is raised:Error in semantic analysis: DISTINCT on different columns not supported with skew in dataSkew groupby should support multiple distinct function.


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