国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Hive 數(shù)據(jù)傾斜問題定位排查及解決

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

[[415207]]

本文轉(zhuǎn)載自微信公眾號「五分鐘學大數(shù)據(jù)」,作者園陌。轉(zhuǎn)載本文請聯(lián)系五分鐘學大數(shù)據(jù)公眾號。

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

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

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

表結構描述

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

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

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

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

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

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

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

user_active 表的數(shù)據(jù)量:1.1 億

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

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

user_intend 表的數(shù)據(jù)量:800 萬

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

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

user_order 表的數(shù)據(jù)量:640 萬

一. 需求

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

二. 代碼

根據(jù)以上需求,我們以 user_info 表為基礎表,將其余表關聯(lián)為一個寬表,代碼如下:

  1. select 
  2.   a.userkey, 
  3.   a.idno, 
  4.   a.phone, 
  5.   a.name
  6.   b.user_active_at, 
  7.   c.intend_commodity, 
  8.   c.intend_rank, 
  9.   d.order_num, 
  10.   d.order_amount 
  11. from user_info a 
  12. left join user_active b on a.userkey = b.userkey 
  13. left join user_intend c on a.phone = c.phone 
  14. left join user_order d on a.idno = d.idno; 

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

這時我們就應該考慮出現(xiàn)數(shù)據(jù)傾斜了。其實還有一種情況可能是數(shù)據(jù)傾斜,就是任務超時被殺掉,Reduce 處理的數(shù)據(jù)量巨大,在做 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

三. 傾斜問題排查

數(shù)據(jù)傾斜大多數(shù)都是大 key 問題導致的。

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

1. 通過時間判斷

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

注意:要排除兩種情況:

  • 如果每個 reduce 執(zhí)行時間差不多,都特別長,不一定是數(shù)據(jù)傾斜導致的,可能是 reduce 設置過少導致的。
  • 有時候,某個 task 執(zhí)行的節(jié)點可能有問題,導致任務跑的特別慢。這個時候,mapreduce 的推測執(zhí)行,會重啟一個任務。如果新的任務在很短時間內(nèi)能完成,通常則是由于 task 執(zhí)行節(jié)點問題導致的個別 task 慢。但是如果推測執(zhí)行后的 task 執(zhí)行任務也特別慢,那更說明該 task 可能會有傾斜問題。

2. 通過任務 Counter 判斷

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

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

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

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

四. 定位 SQL 代碼

1. 確定任務卡住的 stage

  • 通過 jobname 確定 stage:

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

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

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

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

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

2. 確定 SQL 執(zhí)行代碼

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

就可以推測出是在執(zhí)行下面紅框中代碼時出現(xiàn)了數(shù)據(jù)傾斜,因為這行的表的別名是 d:

五. 解決傾斜

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

傾斜原因:

本文的示例數(shù)據(jù)中 user_info 和 user_order 通過身份證號關聯(lián),檢查發(fā)現(xiàn) user_info 表中身份證號為空的有 7000 多萬,原因就是這 7000 多萬數(shù)據(jù)都分配到一個 reduce 去執(zhí)行,導致數(shù)據(jù)傾斜。

解決方法:

可以先把身份證號為空的去除之后再關聯(lián),最后按照 userkey 連接,因為 userkey 全部都是有值的:

  1. with t1 as
  2. select 
  3.   u.userkey, 
  4.   o.* 
  5. from user_info u 
  6. left join user_order o 
  7. on u.idno = o.idno 
  8. where u.idno is not null 
  9. --是可以把where條件寫在后面的,hive會進行謂詞下推,先執(zhí)行where條件在執(zhí)行 left join 
  10.  
  11. select 
  12.   a.userkey, 
  13.   a.idno, 
  14.   a.phone, 
  15.   a.name
  16.   b.user_active_at, 
  17.   c.intend_commodity, 
  18.   c.intend_rank, 
  19.   d.order_num, 
  20.   d.order_amount 
  21. from user_info a 
  22. left join user_active b on a.userkey = b.userkey 
  23. left join user_intend c on a.phone = c.phone 
  24. left join t1 d on a.userkey = d.userkey; 

也可以這樣,給身份證為空的數(shù)據(jù)賦個隨機值,但是要注意隨機值不能和表中的身份證號有重復:

  1. select 
  2.   a.userkey, 
  3.   a.idno, 
  4.   a.phone, 
  5.   a.name
  6.   b.user_active_at, 
  7.   c.intend_commodity, 
  8.   c.intend_rank, 
  9.   d.order_num, 
  10.   d.order_amount 
  11. from user_info a 
  12. left join user_active b on a.userkey = b.userkey 
  13. left join user_intend c on a.phone = c.phone 
  14. left join user_order d on nvl(a.idno,concat(rand(),'idnumber')) = d.idno; 

其他的解決數(shù)據(jù)傾斜的方法:

1. 過濾掉臟數(shù)據(jù)

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

2. 數(shù)據(jù)預處理

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

3. 增加 reduce 個數(shù)

如果數(shù)據(jù)中出現(xiàn)了多個大 key,增加 reduce 個數(shù),可以讓這些大 key 落到同一個 reduce 的概率小很多。

配置 reduce 個數(shù):

  1. set mapred.reduce.tasks = 15; 

4. 轉(zhuǎn)換為 mapjoin

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

配置 mapjoin:

  1. set hive.auto.convert.join = true;  是否開啟自動mapjoin,默認是true 
  2.  
  3. set hive.mapjoin.smalltable.filesize=100000000;   mapjoin的表size大小 

5. 啟用傾斜連接優(yōu)化

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

配置傾斜連接優(yōu)化:

  1. set hive.optimize.skewjoin=true; 啟用傾斜連接優(yōu)化 
  2.  
  3. set hive.skewjoin.key=200000; 超過20萬行就認為該鍵是偏斜連接鍵 

6. 調(diào)整內(nèi)存設置

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

配置內(nèi)存:

  1. set mapreduce.reduce.memory.mb=5120; 設置reduce內(nèi)存大小 
  2.  
  3. set mapreduce.reduce.java.opts=-Xmx5000m -XX:MaxPermSize=128m; 

 

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

 

責任編輯:武曉燕 來源: 五分鐘學大數(shù)據(jù)
相關推薦

2021-04-22 07:21:55

Hive數(shù)據(jù)傾斜

2023-07-26 07:22:32

2020-11-03 10:16:24

Hive數(shù)據(jù)傾斜Hive SQL

2022-12-12 08:13:27

Redis數(shù)據(jù)傾斜

2019-10-11 19:45:28

SparkSQLHiveHadoop

2022-02-23 12:07:20

分布式Spark數(shù)據(jù)傾斜

2016-10-20 15:27:18

MySQLredo死鎖

2018-03-01 08:56:20

存儲能力定位

2024-10-10 15:32:51

2013-04-28 09:19:20

綜合布線故障排查校園網(wǎng)

2018-08-10 15:00:42

服務器內(nèi)存排查

2020-04-01 11:05:24

Spark數(shù)據(jù)傾斜Hadoop

2023-10-08 13:10:00

Redis數(shù)據(jù)庫

2024-11-21 16:47:55

2024-12-02 01:16:53

2021-02-20 08:40:19

HiveExplain底層

2016-11-14 10:06:04

大數(shù)據(jù)max位圖

2012-08-08 14:33:32

IBMdW

2018-11-29 09:00:58

故障定位運維

2023-10-13 12:05:55

RedisBig Key
點贊
收藏

51CTO技術棧公眾號

亚洲人成影院在线观看| 色在人av网站天堂精品| 亚洲成人av免费看| 激情六月婷婷综合| 国产女主播一区二区三区| 少妇精品久久久一区二区| 精品国产一区二区三区久久久| 性爱视频在线播放| 色婷婷亚洲综合| 在线免费观看黄色片| 亚洲女同ⅹxx女同tv| 最新天堂中文在线| 久久综合九色综合97婷婷| 成人污网站在线观看| 日韩福利电影在线观看| 欧美乱偷一区二区三区在线| 亚洲激情综合| 国产日产亚洲精品| 色777狠狠狠综合伊人| 国产精品pans私拍| 久久av免费看| 国产精品久久久久999| 欧洲亚洲一区二区三区| 91国产美女在线观看| 少妇一区二区三区| 国产成人福利网站| 色婷婷热久久| 成人黄色av免费在线观看| 日本欧美视频| 成人免费视频网址| 久久久久久美女精品 | 国产一级特黄a大片免费| 成人精品免费看| 日韩欧美在线播放视频| 久久综合久久99| 亚洲欧美国产中文| 午夜精品久久久久久久 | 国产传媒一区二区| 老**午夜毛片一区二区三区| 中文视频一区视频二区视频三区| 国产麻豆精品久久一二三| 欧美成人高潮一二区在线看| 亚洲性受xxx喷奶水| 国产精品沙发午睡系列| 日本韩国欧美| 国产亚洲精品成人av久久ww| 国产成人精选| 国内精品视频久久| 日本久久精品| 国产欧美欧洲| 日韩av在线免费观看不卡| 六月婷婷激情网| 国产婷婷精品av在线| 中文字幕2018| 欧美乱妇23p| 农村妇女一区二区| 国产精品一区专区欧美日韩| 99亚洲一区二区| 日本阿v视频在线观看| 亚洲婷婷综合色高清在线| 国产高清视频免费最新在线| 日韩黄在线观看| 欧美日韩破处| 免费中文日韩| 国产日产欧美一区| 欧美美女搞黄| 亚洲偷欧美偷国内偷| 综合国产视频| 日韩亚洲视频在线| 国产欧美一区二区精品婷婷| www亚洲人| 久久亚洲精品小早川怜子66| 亚洲精品久久久| 日韩中文字幕亚洲精品欧美| 亚洲影院在线观看| 国产在线观看www| 国产91在线高潮白浆在线观看| 亚洲精品在线二区| 波多野结衣之无限发射| 婷婷夜色潮精品综合在线| 东京一区二区| 成人精品一区二区三区电影免费 | 日韩啪啪电影网| 蜜桃视频一区二区在线观看| 婷婷开心久久网| 久久国内精品| 极品日韩久久| 国产精品麻豆视频| 成入视频在线观看| 国产伦精品一区二区三区精品视频| 久久激情五月激情| 青梅竹马是消防员在线| 久久久成人av| 日本中文字幕不卡| 性欧美孕妇孕交| 久久久久免费视频| 国产一区二区伦理片| 国产黄色免费在线观看| 欧美重口另类videos人妖| 国产一区二区三区四| 成人在线免费观看| 国产精品极品美女粉嫩高清在线| 国产精品一二三| 午夜不卡视频| 91亚洲人电影| 亚洲专区一二三| 中文字幕日韩高清在线| 青草视频在线观看视频| 欧美变态凌虐bdsm| 黄色国产精品| 天堂av在线播放| 国产精品普通话| 亚洲人成精品久久久久久| 91久久青草| 妞干网在线观看视频| 日韩精品免费一线在线观看| 西西裸体人体做爰大胆久久久| 青檬在线电视剧在线观看| 8050国产精品久久久久久| 国产视频一区在线播放| 日韩一级二级| 91xxx视频| 日韩电影免费观看在线观看| 日本在线不卡一区| 中文字幕在线播放网址| 精品蜜桃一区二区三区| 欧美丝袜丝nylons| 欧美在线精品一区| 国产精品秘入口| 国产精品sss| 欧美蜜桃一区二区三区| 老鸭窝亚洲一区二区三区| 超碰人人在线| 水蜜桃一区二区| 亚洲精品第一页| 国产成人综合精品三级| 国精品产品一区| 各处沟厕大尺度偷拍女厕嘘嘘| 欧美精品手机在线| 国产精品久久久久久久午夜片| 超碰97久久| 粉嫩喷白浆久久| 91精品国产高清久久久久久91裸体| 亚洲成人av在线电影| 欧美色图麻豆| 在线观看av免费| av动漫在线免费观看| 久久精品国产电影| 中文字幕色av一区二区三区| 精品少妇av| a√资源在线| 色中文字幕在线观看| 日日噜噜噜夜夜爽亚洲精品| 国产区在线观看成人精品| 国产成人3p视频免费观看| 蜜桃视频在线入口www| 视频一区二区三| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 免费全黄无遮挡裸体毛片| 国产精品福利在线观看网址| 欧洲一区二区三区免费视频| 蜜桃视频一区| 欧美亚洲大片| av漫画网站| 国产亚洲欧美一区二区三区| 日韩精品极品在线观看| 久久嫩草精品久久久久| 欧美精品尤物在线观看 | 亚洲一区在线播放| 日韩亚洲精品在线| 欧美电影免费观看| 一本久道中文无码字幕av| 国产精品美女网站| 欧美成人a视频| 久久伊99综合婷婷久久伊| 国产精品久久久久蜜臀| 91高清在线观看视频| 国产精品欧美激情在线观看| 91精品视频播放| 国产亚洲福利一区| 午夜av区久久| 久久精品国产亚洲a| 亚洲免费福利一区| 91九色在线看| 97国产在线| 最新精品视频| 国产精品久久婷婷六月丁香| 亚洲成人三级在线| 国产精品网站在线播放| 国产视频亚洲| 欧美激情影院| 美女网站在线看| 亚洲激情文学| 成人毛片一区二区| 超碰97国产在线| 欧美美女操人视频| 日韩一二在线观看| 成人免费在线播放视频| 老司机精品视频一区二区三区| 先锋影音国产精品|