您好,登錄后才能下訂單哦!
這篇文章主要介紹了hive如何優(yōu)化,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Hive謂詞下推(Predicate pushdown)
參數(shù)打開(kāi)設(shè)置:hive.optimize.ppd=true
實(shí)現(xiàn):在不影響結(jié)果的情況下,盡量將過(guò)濾條件提前執(zhí)行。謂詞下推后,過(guò)濾條件在map端執(zhí)行,減少了map端的輸出,降低了數(shù)據(jù)在集群上傳輸?shù)牧?,?jié)約了集群的資源,也提升了任務(wù)的性能。
開(kāi)啟Map端聚合功能
參數(shù)打開(kāi)設(shè)置:hive.map.aggr=true
實(shí)現(xiàn):在map中會(huì)做部分聚集操作,能夠使map傳送給reduce的數(shù)據(jù)量大大減少,從而在一定程度上減輕group by帶來(lái)的數(shù)據(jù)傾斜。
小文件合并
參數(shù)設(shè)置:
set hive.merge.mapfiles = true ##在 map only 的任務(wù)結(jié)束時(shí)合并小文件
set hive.merge.mapredfiles = false ## true 時(shí)在 MapReduce 的任務(wù)結(jié)束時(shí)合并小文件
set hive.merge.size.per.task =256*1000*1000 ##合并文件的大小
set mapred.max.split.size=256000000; ##每個(gè) Map 最大分割大小
set mapred.min.split.size.per.node=1; ##一個(gè)節(jié)點(diǎn)上 split 的最少值
sethive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; ##執(zhí)行 Map 前進(jìn)行小文件合并
實(shí)現(xiàn):文件數(shù)目過(guò)多,會(huì)給HDFS帶來(lái)壓力,并且會(huì)影響處理效率,可以通過(guò)合并Map和Reduce的結(jié)果文件來(lái)消除這樣的影響。
解決group by造成的數(shù)據(jù)傾斜
參數(shù)設(shè)置:hive.groupby.skewindata=true
實(shí)現(xiàn):當(dāng)選項(xiàng)設(shè)定為 true,生成的查詢計(jì)劃會(huì)有兩個(gè) MR Job。第一個(gè) MR Job 中,Map 的輸出結(jié)果集合會(huì)隨機(jī)分布到Reduce 中,每個(gè) Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group By Key有可能被分發(fā)到不同的 Reduce 中,從而達(dá)到負(fù)載均衡的目的;第二個(gè) MR Job 再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group ByKey 分布到 Reduce 中(這個(gè)過(guò)程可以保證相同的 Group By Key 被分布到同一個(gè) Reduce中),最后完成最終的聚合操作。
當(dāng)hive.groupby.skewindata=true時(shí),hive不支持多列上的去重操作,并報(bào)錯(cuò):
Error in semanticanalysis: DISTINCT on different columns notsupported with skew in data.
并行執(zhí)行
參數(shù)設(shè)置:
set hive.exec.parallel=true,可以開(kāi)啟并發(fā)執(zhí)行。
set hive.exec.parallel.thread.number=16; //同一個(gè)sql允許最大并行度,默認(rèn)為8。
實(shí)現(xiàn):Hive會(huì)將一個(gè)查詢轉(zhuǎn)化為一個(gè)或多個(gè)階段,包括:MapReduce階段、抽樣階段、合并階段、limit階段等。默認(rèn)情況下,一次只執(zhí)行一個(gè)階段。不過(guò),如果某些階段不是互相依賴,是可以并行執(zhí)行的。
限制笛卡爾積查詢
兩張表join時(shí)必須有on語(yǔ)句
參數(shù)設(shè)置:set hive.mapred.mode=strict
實(shí)現(xiàn):即使數(shù)據(jù)量不大的情況下,笛卡爾積造成的數(shù)據(jù)壓力也是很可觀的,盡量在參數(shù)階段進(jìn)行限制,防止誤操作。
SQL層面優(yōu)化
對(duì)于復(fù)雜的邏輯加工,有以下幾個(gè)原則:
1、數(shù)據(jù)量大的表應(yīng)盡早進(jìn)行數(shù)據(jù)篩選并可插入到一張臨時(shí)表,比如按日期篩選或者地區(qū)等,再與其他表進(jìn)行邏輯關(guān)聯(lián),可大大減少數(shù)據(jù)處理時(shí)間,這是最簡(jiǎn)單也是最有效的辦法;
2、多個(gè)結(jié)果集union all的時(shí)候,可以使用逐個(gè)insertinto到結(jié)果表的方式,可提高數(shù)據(jù)處理速度;
3、join操作左表盡可能放置小表,MR的處理邏輯將小表緩存內(nèi)存里,然后再去掃描大表,此時(shí)效率高;
4、hive雖然已經(jīng)支持in/exists語(yǔ)法,少量查詢也是可以用的,但是更推薦用left semi join形式改寫(xiě)一下,可以在數(shù)據(jù)量大的時(shí)候?qū)Ρ认聝煞N寫(xiě)法效率;
5、還有一些基礎(chǔ)的原則啰嗦下:sort by代替order by;group by代替distinct;多表join盡量key相同;空值在join中可能會(huì)造成數(shù)據(jù)傾斜,如果空值部分?jǐn)?shù)據(jù)對(duì)結(jié)果集無(wú)影響,提前篩掉;等等~
實(shí)際生產(chǎn)中一定要結(jié)合業(yè)務(wù)和公司數(shù)據(jù)特點(diǎn),某些優(yōu)化也不是萬(wàn)能藥膏,多些實(shí)踐對(duì)比總會(huì)發(fā)現(xiàn)更多優(yōu)化空間。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“hive如何優(yōu)化”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。