91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

16、Hive數據傾斜與解決方案

發布時間:2020-03-05 10:14:15 來源:網絡 閱讀:293 作者:victor19901114 欄目:大數據

數據傾斜

1、什么是數據傾斜

由于數據分布不均勻,造成數據大量的集中到一點,造成數據熱點

2、數據傾斜的現象

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

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

3、數據傾斜的情況

16、Hive數據傾斜與解決方案

4、數據傾斜的原因

1)、key分布不均勻

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

3)、建表時考慮不周

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

5、數據傾斜的解決方案

5.1 map端聚合
--Map 端部分聚合,相當于Combiner
hive.map.aggr = true;
--有數據傾斜的時候進行負載均衡
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 中),最后完成最終的聚合操作。
5.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回去
5.3 典型的業務場景
  • 空值產生的數據傾斜

    • 場景
    如日志中,常會有信息丟失的問題,比如日志中的 user_id,如果取其中的 user_id 和 用戶表中的user_id 關聯,會碰到數據傾斜的問題。
    • 解決辦法
    --user_id為空的不參與關聯
    
    select * from log a
    join users b
    on a.user_id is not null
    and a.user_id = b.user_id
    union all
    select * 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;
    
  • 不同數據類型關聯產生數據傾斜

    • 場景
    用戶表中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);
    
向AI問一下細節

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

AI

贡嘎县| 吉隆县| 贵定县| 建平县| 尼玛县| 山东省| 万年县| 揭东县| 光泽县| 金湖县| 临洮县| 博罗县| 新郑市| 清涧县| 大连市| 钟山县| 德格县| 安福县| 息烽县| 措美县| 大兴区| 万荣县| 丹江口市| 沙湾县| 社会| 靖边县| 南木林县| 金塔县| 玉门市| 福贡县| 西安市| 新龙县| 濮阳市| 临朐县| 淮南市| 屏东市| 陇南市| 巢湖市| 玉田县| 石门县| 阿勒泰市|