精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

簡述Hive 數據傾斜問題定位排查及解決

數據分析與開發 ? 來源:五分鐘學大數據 ? 作者:園陌 ? 2021-10-08 09:10 ? 次閱讀

多數介紹數據傾斜的文章都是以大篇幅的理論為主,并沒有給出具體的數據傾斜案例。當工作中遇到了傾斜問題,這些理論很難直接應用,導致我們面對傾斜時還是不知所措。

今天我們不扯大篇理論,直接以例子來實踐,排查是否出現了數據傾斜,具體是哪段代碼導致的傾斜,怎么解決這段代碼的傾斜。

當執行過程中任務卡在 99%,大概率是出現了數據傾斜,但是通常我們的 SQL 很大,需要判斷出是哪段代碼導致的傾斜,才能利于我們解決傾斜。通過下面這個非常簡單的例子來看下如何定位產生數據傾斜的代碼

表結構描述

先來了解下這些表中我們需要用的字段及數據量:

表的字段非常多,此處僅列出我們需要的字段

第一張表:user_info (用戶信息表,用戶粒度)

字段名 字段含義 字段描述
userkey 用戶 key 用戶標識
idno 用戶的身份證號 用戶實名認證時獲取
phone 用戶的手機 用戶注冊時的手機號
name 用戶的姓名 用戶的姓名

user_info 表的數據量:1.02 億,大小:13.9G,所占空間:41.7G(HDFS三副本)

第二張表:user_active (用戶活躍表,用戶粒度)

字段名 字段含義 字段描述
userkey 用戶 key 用戶沒有注冊會分配一個 key
user_active_at 用戶的最后活躍日期 從埋點日志表中獲取用戶的最后活躍日期

user_active 表的數據量:1.1 億

第三張表:user_intend(用戶意向表,此處只取近六個月的數據,用戶粒度)

字段名 字段含義 字段描述
phone 用戶的手機號 有意向的用戶必須是手機號注冊的用戶
intend_commodity 用戶意向次數最多的商品 客戶對某件商品意向次數最多
intend_rank 用戶意向等級 用戶的購買意愿等級,級數越高,意向越大

user_intend 表的數據量:800 萬

第四張表:user_order(用戶訂單表,此處只取近六個月的訂單數據,用戶粒度)

字段名 字段含義 字段描述
idno 用戶的身份證號 下訂單的用戶都是實名認證的
order_num 用戶的訂單次數 用戶近六個月下單次數
order_amount 用戶的訂單總金額 用戶近六個月下單總金額

user_order 表的數據量:640 萬

1. 需求

需求非常簡單,就是將以上四張表關聯組成一張大寬表,大寬表中包含用戶的基本信息,活躍情況,購買意向及此用戶下訂單情況。

2. 代碼

根據以上需求,我們以 user_info 表為基礎表,將其余表關聯為一個寬表,代碼如下:

select
a.userkey,
a.idno,
a.phone,
a.name,
b.user_active_at,
c.intend_commodity,
c.intend_rank,
d.order_num,
d.order_amount
fromuser_infoa
leftjoinuser_activebona.userkey=b.userkey
leftjoinuser_intendcona.phone=c.phone
leftjoinuser_orderdona.idno=d.idno;

執行上述語句,在執行到某個 job 時任務卡在 99%:

7e4ad528-26b6-11ec-82a8-dac502259ad0.png

這時我們就應該考慮出現數據傾斜了。其實還有一種情況可能是數據傾斜,就是任務超時被殺掉,Reduce 處理的數據量巨大,在做 full gc 的時候,stop the world。導致響應超時,超出默認的 600 秒,任務被殺掉。報錯信息一般如下:

AttemptID:attempt_1624419433039_1569885_r_000000 Timed outafter 600 secs Container killed by the ApplicationMaster. Container killed onrequest. Exit code is 143 Container exited with a non-zero exit code 143

3. 傾斜問題排查

數據傾斜大多數都是大 key 問題導致的。

如何判斷是大 key 導致的問題,可以通過下面方法:

1. 通過時間判斷

如果某個 reduce 的時間比其他 reduce 時間長的多,如下圖,大部分 task 在 1 分鐘之內完成,只有 r_000000 這個 task 執行 20 多分鐘了還沒完成。

7e8f9640-26b6-11ec-82a8-dac502259ad0.png

注意:要排除兩種情況:

  1. 如果每個 reduce 執行時間差不多,都特別長,不一定是數據傾斜導致的,可能是 reduce 設置過少導致的。

  2. 有時候,某個 task 執行的節點可能有問題,導致任務跑的特別慢。這個時候,mapreduce 的推測執行,會重啟一個任務。如果新的任務在很短時間內能完成,通常則是由于 task 執行節點問題導致的個別 task 慢。但是如果推測執行后的 task 執行任務也特別慢,那更說明該 task 可能會有傾斜問題。

2. 通過任務 Counter 判斷

Counter 會記錄整個 job 以及每個 task 的統計信息。counter 的 url 一般類似:

http://bd001:8088/proxy/application_1624419433039_1569885/mapreduce/singletaskcounter/task_1624419433039_1569885_r_000000/org.apache.hadoop.mapreduce.FileSystemCounter

通過輸入記錄數,普通的 task counter 如下,輸入的記錄數是 13 億多:

7ed8656e-26b6-11ec-82a8-dac502259ad0.png

7f0e2154-26b6-11ec-82a8-dac502259ad0.png

而 task=000000 的 counter 如下,其輸入記錄數是 230 多億。是其他任務的 100 多倍:

7f3042f2-26b6-11ec-82a8-dac502259ad0.png

4. 定位 SQL 代碼

1. 確定任務卡住的 stage

  • 通過 jobname 確定 stage:

    一般 Hive 默認的 jobname 名稱會帶上 stage 階段,如下通過 jobname 看到任務卡住的為 Stage-4:

7f5dd6ae-26b6-11ec-82a8-dac502259ad0.png

  • 如果 jobname 是自定義的,那可能沒法通過 jobname 判斷 stage。需要借助于任務日志:

    找到執行特別慢的那個 task,然后 Ctrl+F 搜索 “CommonJoinOperator: JOIN struct” 。Hive 在 join 的時候,會把 join 的 key 打印到日志中。如下:

7f9d9dde-26b6-11ec-82a8-dac502259ad0.png

上圖中的關鍵信息是:struct<_col0:string, _col1:string, _col3:string>

這時候,需要參考該 SQL 的執行計劃。通過參考執行計劃,可以斷定該階段為 Stage-4 階段:

7fb06586-26b6-11ec-82a8-dac502259ad0.png

2. 確定 SQL 執行代碼

確定了執行階段,即 stage。通過執行計劃,則可以判斷出是執行哪段代碼時出現了傾斜。還是從此圖,這個 stage 中進行連接操作的表別名是 d:

801276f4-26b6-11ec-82a8-dac502259ad0.png

就可以推測出是在執行下面紅框中代碼時出現了數據傾斜,因為這行的表的別名是 d:

8063b334-26b6-11ec-82a8-dac502259ad0.png

5. 解決傾斜

我們知道了哪段代碼引起的數據傾斜,就針對這段代碼查看傾斜原因,看下這段代碼的表中數據是否有異常。

傾斜原因:

本文的示例數據中 user_info 和 user_order 通過身份證號關聯,檢查發現 user_info 表中身份證號為空的有 7000 多萬,原因就是這 7000 多萬數據都分配到一個 reduce 去執行,導致數據傾斜。

解決方法

  1. 可以先把身份證號為空的去除之后再關聯,最后按照 userkey 連接,因為 userkey 全部都是有值的:
witht1as(
select
  u.userkey,
  o.*
fromuser_infou
leftjoinuser_ordero
onu.idno=o.idno
whereu.idnoisnotnull
--是可以把where條件寫在后面的,hive會進行謂詞下推,先執行where條件在執行leftjoin
)

select
a.userkey,
a.idno,
a.phone,
a.name,
b.user_active_at,
c.intend_commodity,
c.intend_rank,
d.order_num,
d.order_amount
fromuser_infoa
leftjoinuser_activebona.userkey=b.userkey
leftjoinuser_intendcona.phone=c.phone
leftjoint1dona.userkey=d.userkey;
  1. 也可以這樣,給身份證為空的數據賦個隨機值,但是要注意隨機值不能和表中的身份證號有重復:
select
a.userkey,
a.idno,
a.phone,
a.name,
b.user_active_at,
c.intend_commodity,
c.intend_rank,
d.order_num,
d.order_amount
fromuser_infoa
leftjoinuser_activebona.userkey=b.userkey
leftjoinuser_intendcona.phone=c.phone
leftjoinuser_orderdonnvl(a.idno,concat(rand(),'idnumber'))=d.idno;

其他的解決數據傾斜的方法

1. 過濾掉臟數據

如果大 key 是無意義的臟數據,直接過濾掉。本場景中大 key 有實際意義,不能直接過濾掉。

2. 數據預處理

數據做一下預處理(如上面例子,對 null 值賦一個隨機值),盡量保證 join 的時候,同一個 key 對應的記錄不要有太多。

3. 增加 reduce 個數

如果數據中出現了多個大 key,增加 reduce 個數,可以讓這些大 key 落到同一個 reduce 的概率小很多。

配置 reduce 個數:

setmapred.reduce.tasks=15;

4. 轉換為 mapjoin

如果兩個表 join 的時候,一個表為小表,可以用 mapjoin 做。

配置 mapjoin:

sethive.auto.convert.join=true;是否開啟自動mapjoin,默認是true

sethive.mapjoin.smalltable.filesize=100000000;mapjoin的表size大小

5. 啟用傾斜連接優化

hive 中可以設置 hive.optimize.skewjoin 將一個 join sql 分為兩個 job。同時可以設置下 hive.skewjoin.key,此參數表示 join 連接的 key 的行數超過指定的行數,就認為該鍵是偏斜連接鍵,就對 join 啟用傾斜連接優化。默認 key 的行數是 100000。

配置傾斜連接優化:

sethive.optimize.skewjoin=true;啟用傾斜連接優化

sethive.skewjoin.key=200000;超過20萬行就認為該鍵是偏斜連接鍵

6. 調整內存設置

適用于那些由于內存超限任務被 kill 掉的場景。通過加大內存起碼能讓任務跑起來,不至于被殺掉。該參數不一定會明顯降低任務執行時間。

配置內存:

setmapreduce.reduce.memory.mb=5120;設置reduce內存大小

setmapreduce.reduce.java.opts=-Xmx5000m-XX:MaxPermSize=128m;

附:Hive 配置屬性官方鏈接:https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties

編輯:jq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    6909

    瀏覽量

    88849
  • SQL
    SQL
    +關注

    關注

    1

    文章

    760

    瀏覽量

    44081
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368
  • hive
    +關注

    關注

    0

    文章

    12

    瀏覽量

    3841

原文標題:實操 : Hive 數據傾斜問題定位排查及解決

文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    機智云歷史數據導出與排查指南

    機智云歷史數據導出與排查指南在使用機智云平臺進行設備管理和數據監控時,歷史數據的導出和排查是常見的需求。機智云提供了開放的API接口,方便用
    的頭像 發表于 11-21 01:01 ?82次閱讀
    機智云歷史<b class='flag-5'>數據</b>導出與<b class='flag-5'>排查</b>指南

    輸電線路桿塔傾斜在線監測裝置,桿塔傾斜預警大師

    很多人還不知道桿塔傾斜有怎樣的危害以及桿塔傾斜是什么?桿塔傾斜是指輸電線路的桿塔在垂直方向上偏離了正常位置,出現一定角度或位移的現象。 產生原因 1、桿塔基礎是確保桿塔穩定的關鍵。水土流失、地基沉降
    的頭像 發表于 11-20 18:05 ?119次閱讀

    北斗輸電線路桿塔傾斜在線監測裝置 高精度差分定位 雙天線

    該裝置結合北斗技術和物聯網技術,實現對桿塔傾斜狀態的實時監測,包括航向?、順線傾斜度、橫線傾斜度等,并將監測數據無線發送至監測中心進行處理,一旦監測
    的頭像 發表于 11-08 10:55 ?134次閱讀

    電桿傾斜監測裝置 桿塔傾斜監測裝置 支持數據實時讀取 精確預警

    TLKS-PMG-QX電桿傾斜監測裝置的核心組件是雙軸傾角傳感器,該傳感器能夠精確測量桿塔在縱向和橫向兩個方向的傾斜角度。傳感器持續進行數據采集,并將這些數據實時傳輸至監測主機。監測主
    的頭像 發表于 11-05 11:05 ?177次閱讀
    電桿<b class='flag-5'>傾斜</b>監測裝置 桿塔<b class='flag-5'>傾斜</b>監測裝置 支持<b class='flag-5'>數據</b>實時讀取 精確預警

    傾斜傳感器的種類與選擇技巧

    2024-07-17 傾斜傳感器,又稱傾角傳感器或傾斜計,是一種測量物體相對于重力場的傾斜角度的設備。這些傳感器在各種應用中都有廣泛的使用,包括工業自動化、航空航天、樓宇、汽車和消費類電子產品等領域
    的頭像 發表于 10-02 17:10 ?469次閱讀
    <b class='flag-5'>傾斜</b>傳感器的種類與選擇技巧

    數據從業者必知必會的Hive SQL調優技巧

    數據從業者必知必會的Hive SQL調優技巧 摘要 :在大數據領域中,Hive SQL被廣泛應用于數據倉庫的
    的頭像 發表于 09-24 13:30 ?185次閱讀

    科普小課堂|LCD 問題排查思路解析

    在嵌入式系統開發中,液晶顯示器(LCD)作為人機交互的重要界面,其穩定性和可靠性至關重要。然而在實際應用中,LCD難免會遇到各種問題。今天和各位小伙伴分享一些常見的LCD問題及其排查思路,幫助大家快速定位并解決這些問題。
    的頭像 發表于 08-05 17:06 ?1008次閱讀
    科普小課堂|LCD 問題<b class='flag-5'>排查</b>思路解析

    故障排查小能手:輸電線路分布式故障定位裝置大解析

    。同時,通過故障波形數據還能夠提供故障類型、電壓和負荷電流等相關信息,故障結果以無線通信方式發送至監測中心,方便運維人員及時進行故障排查和修復。
    的頭像 發表于 07-04 10:18 ?457次閱讀

    “Spark+Hive”在DPU環境下的性能測評 | OLAP數據庫引擎選型白皮書(24版)DPU部分節選

    在奇點云2024年版《OLAP數據庫引擎選型白皮書》中,中科馭數聯合奇點云針對Spark+Hive這類大數據計算場景下的主力引擎,測評DPU環境下對比CPU環境下的性能提升效果。特此節選該章節內容,與大家共享。
    的頭像 發表于 05-30 16:09 ?458次閱讀
    “Spark+<b class='flag-5'>Hive</b>”在DPU環境下的性能測評 | OLAP<b class='flag-5'>數據</b>庫引擎選型白皮書(24版)DPU部分節選

    電纜故障排查技術案例筆記

    電纜故障排查技術案例筆記
    的頭像 發表于 05-20 17:03 ?547次閱讀
    電纜故障<b class='flag-5'>排查</b>技術案例筆記

    基于北斗差分定位的桿塔傾斜/沉降/位移監測系統

    武漢風河智能研發的FH-900Y北斗桿塔傾斜/位移/沉降在線監測系統,利用差分GPS/北斗技術、GPRS/4G及LORA等無線通信技術,實現對鐵塔狀態的遠程監控
    的頭像 發表于 03-13 10:25 ?1547次閱讀
    基于北斗差分<b class='flag-5'>定位</b>的桿塔<b class='flag-5'>傾斜</b>/沉降/位移監測系統

    配網故障定位裝置:實現高效故障排查的利器

    ,實現故障桿塔級精確定位。達到強化線路缺陷隱患排查,提升配網單線接地故障準確定位和快速處理的目的,為配網精益運維提供技術支撐。
    的頭像 發表于 01-24 13:51 ?375次閱讀

    輸電線路桿塔傾斜監測預警裝置的工作原理及功能特點

    輸電線路桿塔傾斜監測預警裝置可以實時采集線路桿塔的傾斜數據,包括縱向傾斜角、橫向傾斜角和綜合傾斜
    的頭像 發表于 01-11 16:47 ?1016次閱讀

    配網故障定位裝置:故障排查的利器!

    我們快速找出故障原因,從而及時進行修復。今天,就讓我們一起來了解一下這款神奇的[配網故障定位裝置]吧 一、什么是配網故障定位裝置?? 配網故障定位裝置是一種專門用于電力系統故障排查的設
    的頭像 發表于 12-18 10:26 ?895次閱讀
    配網故障<b class='flag-5'>定位</b>裝置:故障<b class='flag-5'>排查</b>的利器!

    Java怎么排查oom異常

    量的應用中。要排查OOM異常,需要經過以下幾個步驟: 理解OOM異常的原因:OOM異常通常有以下幾個原因:內存泄露、內存溢出、內存不足以容納所需的數據等。理解OOM異常的原因對排查問題非常重要。 配置Java堆內存:要解決OOM
    的頭像 發表于 12-05 13:47 ?1214次閱讀