Hive優(yōu)化的十大方法

Hive用的好逼蒙,才能從數(shù)據(jù)中挖掘出更多的信息來(lái)野揪。用過(guò)hive的朋友,我想或多或少都有類(lèi)似的經(jīng)歷:一天下來(lái)凿掂,沒(méi)跑幾次hive伴榔,就到下班時(shí)間了。Hive在極大數(shù)據(jù)或者數(shù)據(jù)不平衡等情況下庄萎,表現(xiàn)往往一般踪少,因此也出現(xiàn)了presto、spark-sql等替代品糠涛。這里重點(diǎn)講解hive的優(yōu)化方式援奢,例如

優(yōu)化分組:set hive.auto.convert.join=true;

優(yōu)化表關(guān)聯(lián)內(nèi)存運(yùn)行:/*+MAPJOIN(t1,t3,t4)*/ 

一. 表連接優(yōu)化

  1. 將大表放后頭
    Hive假定查詢(xún)中最后的一個(gè)表是大表。它會(huì)將其它表緩存起來(lái)忍捡,然后掃描最后那個(gè)表集漾。因此通常需要將小表放前面,或者標(biāo)記哪張表是大表:/*streamtable(table_name) */

  2. 使用相同的連接鍵
    當(dāng)對(duì)3個(gè)或者更多個(gè)表進(jìn)行join連接時(shí)锉罐,如果每個(gè)on子句都使用相同的連接鍵的話(huà)帆竹,那么只會(huì)產(chǎn)生一個(gè)MapReduce job。

  3. 盡量盡早地過(guò)濾數(shù)據(jù)
    減少每個(gè)階段的數(shù)據(jù)量脓规,對(duì)于分區(qū)表要加分區(qū)栽连,同時(shí)只選擇需要使用到的字段。

  4. 盡量原子化操作
    盡量避免一個(gè)SQL包含復(fù)雜邏輯,可以使用中間表來(lái)完成復(fù)雜的邏輯

二. 用insert into替換union all
如果union all的部分個(gè)數(shù)大于2秒紧,或者每個(gè)union部分?jǐn)?shù)據(jù)量大绢陌,應(yīng)該拆成多個(gè)insert into 語(yǔ)句,實(shí)際測(cè)試過(guò)程中熔恢,執(zhí)行時(shí)間能提升50%脐湾。示例參考如下:

insert overwite table tablename partition (dt= ....)  

select ..... from ( select ... from A 
union all  
select ... from B  union all select ... from C ) R  

where ...;

可以改寫(xiě)為:

insert into table tablename partition (dt= ....) select .... from A WHERE ...; 
insert into table tablename partition (dt= ....) select .... from B  WHERE ...; 
insert into table tablename partition (dt= ....) select .... from C WHERE ...;

三. order by & sort by
order by : 對(duì)查詢(xún)結(jié)果進(jìn)行全局排序消耗時(shí)間長(zhǎng),需要set hive.mapred.mode=nostrict
sort by : 局部排序,并非全局有序叙淌,提高效率秤掌。

四. transform+python
一種嵌入在hive取數(shù)流程中的自定義函數(shù),通過(guò)transform語(yǔ)句可以把在hive中不方便實(shí)現(xiàn)的功能在python中實(shí)現(xiàn)鹰霍,然后寫(xiě)入hive表中闻鉴。示例語(yǔ)法如下:

select transform({column names1})

using '**.py'

as {column names2}

from {table name}

如果除python腳本外還有其它依賴(lài)資源,可以使用ADD ARVHIVE茂洒。

五. limit 語(yǔ)句快速出結(jié)果
一般情況下孟岛,Limit語(yǔ)句還是需要執(zhí)行整個(gè)查詢(xún)語(yǔ)句,然后再返回部分結(jié)果督勺。有一個(gè)配置屬性可以開(kāi)啟渠羞,避免這種情況—對(duì)數(shù)據(jù)源進(jìn)行抽樣

hive.limit.optimize.enable=true --- 開(kāi)啟對(duì)數(shù)據(jù)源進(jìn)行采樣的功能
hive.limit.row.max.size --- 設(shè)置最小的采樣容量
hive.limit.optimize.limit.file --- 設(shè)置最大的采樣樣本數(shù)

缺點(diǎn):有可能部分?jǐn)?shù)據(jù)永遠(yuǎn)不會(huì)被處理到

六. 本地模式
對(duì)于小數(shù)據(jù)集,為查詢(xún)觸發(fā)執(zhí)行任務(wù)消耗的時(shí)間>實(shí)際執(zhí)行job的時(shí)間智哀,因此可以通過(guò)本地模式次询,在單臺(tái)機(jī)器上(或某些時(shí)候在單個(gè)進(jìn)程上)處理所有的任務(wù)。

set oldjobtracker=${hiveconf:mapred.job.tracker}; 
set mapred.job.tracker=local;  
set marped.tmp.dir=/home/edward/tmp;
set mapred.job.tracker=${oldjobtracker};
sql 語(yǔ)句

可以通過(guò)設(shè)置屬性hive.exec.mode.local.auto的值為true盏触,來(lái)讓Hive在適當(dāng)?shù)臅r(shí)候自動(dòng)啟動(dòng)這個(gè)優(yōu)化渗蟹,也可以將這個(gè)配置寫(xiě)在$HOME/.hiverc文件中。
當(dāng)一個(gè)job滿(mǎn)足如下條件才能真正使用本地模式:

job的輸入數(shù)據(jù)大小必須小于參數(shù):hive.exec.mode.local.auto.inputbytes.max(默認(rèn)128MB)
job的map數(shù)必須小于參數(shù):hive.exec.mode.local.auto.tasks.max(默認(rèn)4)
job的reduce數(shù)必須為0或者1
可用參數(shù)hive.mapred.local.mem(默認(rèn)0)控制child的jvm使用的最大內(nèi)存數(shù)赞辩。

七. 并行執(zhí)行
Hive會(huì)將一個(gè)查詢(xún)轉(zhuǎn)化為一個(gè)或多個(gè)階段雌芽,包括:MapReduce階段、抽樣階段辨嗽、合并階段世落、limit階段等。默認(rèn)情況下糟需,一次只執(zhí)行一個(gè)階段屉佳。 不過(guò),如果某些階段不是互相依賴(lài)洲押,是可以并行執(zhí)行的武花。

set hive.exec.parallel=true,可以開(kāi)啟并發(fā)執(zhí)行。
set hive.exec.parallel.thread.number=16; //同一個(gè)sql允許最大并行度杈帐,默認(rèn)為8体箕。

會(huì)比較耗系統(tǒng)資源专钉。

八. 調(diào)整mapper和reducer的個(gè)數(shù)

  1. Map階段優(yōu)化
    map個(gè)數(shù)的主要的決定因素有: input的文件總個(gè)數(shù),input的文件大小累铅,集群設(shè)置的文件塊大性拘搿(默認(rèn)128M,不可自定義)娃兽。參考舉例如下:

假設(shè)input目錄下有1個(gè)文件a,大小為780M,那么hadoop會(huì)將該文件a分隔成7個(gè)塊(6個(gè)128m的塊和1個(gè)12m的塊)菇民,從而產(chǎn)生7個(gè)map數(shù)
假設(shè)input目錄下有3個(gè)文件a,b,c,大小分別為10m,20m投储,130m第练,那么hadoop會(huì)分隔成4個(gè)塊(10m,20m,128m,2m),從而產(chǎn)生4個(gè)map數(shù)玛荞。
即如果文件大于塊大小(128m),那么會(huì)拆分复旬,如果小于塊大小,則把該文件當(dāng)成一個(gè)塊冲泥。
map執(zhí)行時(shí)間:map任務(wù)啟動(dòng)和初始化的時(shí)間+邏輯處理的時(shí)間。

減少map數(shù)
若有大量小文件(小于128M)壁涎,會(huì)產(chǎn)生多個(gè)map凡恍,處理方法是:

set mapred.max.split.size=100000000; 
set mapred.min.split.size.per.node=100000000; 
set mapred.min.split.size.per.rack=100000000;  

前面三個(gè)參數(shù)確定合并文件塊的大小,大于文件塊大小128m的怔球,按照128m來(lái)分隔嚼酝,小于128m,大于100m的,按照100m來(lái)分隔竟坛,把那些小于100m的(包括小文件和分隔大文件剩下的)進(jìn)行合并闽巩。

set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; – 執(zhí)行前進(jìn)行小文件合并。

增加map數(shù)
當(dāng)input的文件都很大担汤,任務(wù)邏輯復(fù)雜涎跨,map執(zhí)行非常慢的時(shí)候,可以考慮增加Map數(shù)崭歧,來(lái)使得每個(gè)map處理的數(shù)據(jù)量減少隅很,從而提高任務(wù)的執(zhí)行效率。
set mapred.reduce.tasks=?

  1. Reduce階段優(yōu)化
    調(diào)整方式:
set mapred.reduce.tasks=?
set hive.exec.reducers.bytes.per.reducer = ?

一般根據(jù)輸入文件的總大小,用它的estimation函數(shù)來(lái)自動(dòng)計(jì)算reduce的個(gè)數(shù):reduce個(gè)數(shù) = InputFileSize / bytes per reducer

九. 嚴(yán)格模式

set hive.marped.mode=strict --防止用戶(hù)執(zhí)行那些可能意想不到的不好的影響的查詢(xún)

(1)分區(qū)表率碾,必須選定分區(qū)范圍
(2)對(duì)于使用order by的查詢(xún)叔营,要求必須使用limit語(yǔ)句。因?yàn)閛rder by為了執(zhí)行排序過(guò)程會(huì)將所有的結(jié)果數(shù)據(jù)分發(fā)到同一個(gè)reducer中進(jìn)行處理
(3)限制笛卡爾積查詢(xún):兩張表join時(shí)必須有on語(yǔ)句

十. 數(shù)據(jù)傾斜
表現(xiàn):
任務(wù)進(jìn)度長(zhǎng)時(shí)間維持在99%(或100%)所宰,查看任務(wù)監(jiān)控頁(yè)面绒尊,發(fā)現(xiàn)只有少量(1個(gè)或幾個(gè))reduce子任務(wù)未完成。因?yàn)槠涮幚淼臄?shù)據(jù)量和其他reduce差異過(guò)大仔粥。單一reduce的記錄數(shù)與平均記錄數(shù)差異過(guò)大婴谱,通常可能達(dá)到3倍甚至更多。 最長(zhǎng)時(shí)長(zhǎng)遠(yuǎn)大于平均時(shí)長(zhǎng)勘究。

原因:

(1)key分布不均勻
(2)業(yè)務(wù)數(shù)據(jù)本身的特性
(3)建表時(shí)考慮不周
(4)某些SQL語(yǔ)句本身就有數(shù)據(jù)傾斜
file

解決方案:參數(shù)調(diào)節(jié)

set hive.map.aggr=true

關(guān)注我的公眾號(hào)矮湘,后臺(tái)回復(fù)【JAVAPDF】獲取200頁(yè)面試題!
5萬(wàn)人關(guān)注的大數(shù)據(jù)成神之路口糕,不來(lái)了解一下嗎缅阳?
5萬(wàn)人關(guān)注的大數(shù)據(jù)成神之路,真的不來(lái)了解一下嗎景描?
5萬(wàn)人關(guān)注的大數(shù)據(jù)成神之路十办,確定真的不來(lái)了解一下嗎?

歡迎您關(guān)注《大數(shù)據(jù)成神之路》
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末超棺,一起剝皮案震驚了整個(gè)濱河市向族,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌棠绘,老刑警劉巖件相,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氧苍,居然都是意外死亡夜矗,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)让虐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)紊撕,“玉大人,你說(shuō)我怎么就攤上這事赡突《苑觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惭缰,是天一觀(guān)的道長(zhǎng)浪南。 經(jīng)常有香客問(wèn)我,道長(zhǎng)漱受,這世上最難降的妖魔是什么逞泄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮拜效,結(jié)果婚禮上喷众,老公的妹妹穿的比我還像新娘。我一直安慰自己紧憾,他們只是感情好到千,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著赴穗,像睡著了一般憔四。 火紅的嫁衣襯著肌膚如雪膀息。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天了赵,我揣著相機(jī)與錄音潜支,去河邊找鬼。 笑死柿汛,一個(gè)胖子當(dāng)著我的面吹牛冗酿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播络断,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼裁替,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了貌笨?” 一聲冷哼從身側(cè)響起弱判,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锥惋,沒(méi)想到半個(gè)月后昌腰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膀跌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年剥哑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淹父。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怎虫,靈堂內(nèi)的尸體忽然破棺而出暑认,到底是詐尸還是另有隱情,我是刑警寧澤大审,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布蘸际,位于F島的核電站,受9級(jí)特大地震影響徒扶,放射性物質(zhì)發(fā)生泄漏粮彤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一姜骡、第九天 我趴在偏房一處隱蔽的房頂上張望导坟。 院中可真熱鬧,春花似錦圈澈、人聲如沸惫周。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)递递。三九已至喷橙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間登舞,已是汗流浹背贰逾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菠秒,地道東北人姆坚。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓碉就,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子璧坟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容