中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hive大數據傾斜的原因有哪些

發布時間:2021-12-10 10:56:30 來源:億速云 閱讀:176 作者:小新 欄目:云計算

這篇文章主要為大家展示了“hive大數據傾斜的原因有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“hive大數據傾斜的原因有哪些”這篇文章吧。

1數據傾斜的原因

1.1操作:

關鍵詞

情形

后果

Join

其中一個表較小,

但是key集中

分發到某一個或幾個Reduce上的數據遠高于平均值

大表與大表,但是分桶的判斷字段0值或空值過多

這些空值都由一個reduce處理,灰常慢


group by

group by 維度過小,

某值的數量過多

處理某值的reduce灰常耗時

Count Distinct

某特殊值過多

處理此特殊值的reduce耗時

1.2原因:

1)、key分布不均勻

2)、業務數據本身的特性

3)、建表時考慮不周

4)、某些SQL語句本身就有數據傾斜

1.3表現:

任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因為其處理的數據量和其他reduce差異過大。

單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大于平均時長。

2數據傾斜的解決方案

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

關于驅動表的選取,選用join key分布最均勻的表作為驅動表

做好列裁剪和filter操作,以達到兩表做join的時候,數據量相對變小的效果。

大小表Join

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

大表Join大表:

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

count distinct大量相同特殊值

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

group by維度過小:

采用sum() group by的方式來替換count(distinct)完成計算。

特殊情況特殊處理:

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

3典型的業務場景

3.1空值產生的數據傾斜

場景:如日志中,常會有信息丟失的問題,比如日志中的 user_id,如果取其中的 user_id 和 用戶表中的user_id 關聯,會碰到數據傾斜的問題。

解決方法1 user_id為空的不參與關聯(紅色字體為修改后)

select * from log a  join users b  on a.user_id is not null
  and a.user_id = b.user_idunion allselect * from log a  where a.user_id is null;

解決方法賦與空值分新的key值

select *
  from log a  left outer join users b  on case when a.user_id is null then concat(‘hive’,rand() ) else a.user_id end = b.user_id;

結論:方法2比方法1效率更好,不但io少了,而且作業數也少了。解決方法1中 log讀取兩次,jobs是2。解決方法2 job數是1 。這個優化適合無效 id (比如 -99 , ’’, null 等) 產生的傾斜問題。把空值的 key 變成一個字符串加上隨機數,就能把傾斜的數據分到不同的reduce上 ,解決數據傾斜問題。

3.2不同數據類型關聯產生數據傾斜

場景:用戶表中user_id字段為int,log表中user_id字段既有string類型也有int類型。當按照user_id進行兩個表的Join操作時,默認的Hash操作會按int型的id來進行分配,這樣會導致所有string類型id的記錄都分配到一個Reducer中。

解決方法:把數字類型轉換成字符串類型

select * from users a  left outer join logs b  on a.usr_id = cast(b.user_id as string)

3.3小表不小不大,怎么用 map join 解決傾斜問題

使用 map join 解決小表(記錄數少)關聯大表的數據傾斜問題,這個方法使用的頻率非常高,但如果小表很大,大到map join會出現bug或異常,這時就需要特別的處理。 以下例子:

select * from log a  left outer join users b  on a.user_id = b.user_id;

users 表有 600w+ 的記錄,把 users 分發到所有的 map 上也是個不小的開銷,而且 map join 不支持這么大的小表。如果用普通的 join,又會碰到數據傾斜的問題。

解決方法:

select /*+mapjoin(x)*/* from log a
  left outer join (
    select  /*+mapjoin(c)*/d.*
      from ( select distinct user_id from log ) c
      join users d
      on c.user_id = d.user_id
    ) x
  on a.user_id = b.user_id;

假如,log里user_id有上百萬個,這就又回到原來map join問題。所幸,每日的會員uv不會太多,有交易的會員不會太多,有點擊的會員不會太多,有傭金的會員不會太多等等。所以這個方法能解決很多場景下的數據傾斜問題。

以上是“hive大數據傾斜的原因有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

琼结县| 报价| 屏南县| 饶河县| 大城县| 那曲县| 红河县| 渑池县| 伊金霍洛旗| 阆中市| 呼玛县| 五指山市| 什邡市| 哈巴河县| 延津县| 平陆县| 湘潭市| 赫章县| 靖边县| 格尔木市| 怀仁县| 讷河市| 于都县| 梁山县| 开封县| 东至县| 铁岭市| 鸡泽县| 康乐县| 砚山县| 莒南县| 宜黄县| 大厂| 金阳县| 浦城县| 怀远县| 沧州市| 白玉县| 东海县| 慈利县| 白沙|