HIVE SQL優(yōu)化

hive的優(yōu)化主要分為:配置優(yōu)化缅糟、SQL語句優(yōu)化堵漱、任務(wù)優(yōu)化等方案。

其中在開發(fā)過程中主要涉及到的可能是SQL優(yōu)化這塊莱找。

優(yōu)化的核心思想是:

減少數(shù)據(jù)量(例如分區(qū)酬姆、列剪裁);

避免數(shù)據(jù)傾斜(例如加參數(shù)奥溺、Key打散)辞色;

避免全表掃描(例如on添加加上分區(qū)等);

減少job數(shù)(例如相同的on條件的join放在一起作為一個任務(wù))浮定。

HQL語句優(yōu)化

1相满、使用分區(qū)剪裁、列剪裁

在分區(qū)剪裁中桦卒,當(dāng)使用外關(guān)聯(lián)時立美,如果將副表的過濾條件寫在Where后面,那么就會先全表關(guān)聯(lián)方灾,之后再過濾悯辙。

selecta.*fromtest1aleftjointest2bona.uid=b.uidwherea.ds='2020-08-10'andb.ds='2020-08-10'

上面這個SQL主要是犯了兩個錯誤:

副表的過濾條件寫在where后面,會導(dǎo)致先全表關(guān)聯(lián)在過濾分區(qū)迎吵;

on的條件沒有過濾null值的情況,如果兩個數(shù)據(jù)表存在大批量null值的情況针贬,會造成數(shù)據(jù)傾斜击费。

selecta.*fromtest1aleftjointest2bon(d.uidisnotnullanda.uid=b.uidandb.ds='2020-08-10')wherea.ds='2020-08-10'

如果null值也是需要的,那么需要在條件上轉(zhuǎn)換桦他,或者單獨拿出來

selecta.*fromtest1aleftjointest2bon(a.uidisnotnullanda.uid=b.uidandb.ds='2020-08-10')wherea.ds='2020-08-10'unionallselecta.*fromtest1awherea.uidisnull或者selecta.*fromtest1aleftjointest2boncasewhena.uidisnullthenconcat("test",RAND())elsea.uidend=b.uidandb.ds='2020-08-10'wherea.ds='2020-08-10'或者(子查詢)selecta.*fromtest1aleftjoin(selectuidfromtest2whereds='2020-08-10'anduidisnotnull)bona.uid=b.uidwherea.uidisnotnullanda.ds='2020-08-10'

2蔫巩、盡量不要用COUNT

DISTINCT,因為COUNT DISTINCT操作需要用一個Reduce

Task來完成快压,這一個Reduce需要處理的數(shù)據(jù)量太大圆仔,就會導(dǎo)致整個Job很難完成,一般COUNT DISTINCT使用先GROUP

BY再COUNT的方式替換蔫劣,雖然會多用一個Job來完成坪郭,但在數(shù)據(jù)量大的情況下,這個絕對是值得的脉幢。

selectcount(distinctuid)fromtestwhereds='2020-08-10'anduidisnotnull轉(zhuǎn)換為selectcount(a.uid)from(selectuidfromtestwhereuidisnotnullandds='2020-08-10'groupbyuid)a

3歪沃、使用with

as嗦锐,因為拖慢hive查詢效率出了join產(chǎn)生的shuffle以外,還有一個就是子查詢沪曙,在SQL語句里面盡量減少子查詢奕污。with

as是將語句中用到的子查詢事先提取出來(類似臨時表),使整個查詢當(dāng)中的所有模塊都可以調(diào)用該查詢結(jié)果液走。使用with

as可以避免Hive對不同部分的相同子查詢進(jìn)行重復(fù)計算碳默。

selecta.*fromtest1aleftjointest2bona.uid=b.uidwherea.ds='2020-08-10'andb.ds='2020-08-10'可以轉(zhuǎn)化為withbasselectuidfromtest2whereds='2020-08-10'anduidisnotnullselecta.*fromtest1aleftjoinbona.uid=b.uidwherea.ds='2020-08-10'anda.uidisnotnull

4、大小表的join缘眶,寫有Join操作的查詢語句時有一條原則:應(yīng)該將條目少的表/子查詢放在Join操作符的左邊嘱根。原因是在Join操作的Reduce階段,位于Join操作符左邊的表的內(nèi)容會被加載進(jìn)內(nèi)存磅崭,將條目少的表放在左邊儿子,可以有效減少發(fā)生OOM錯誤的幾率。

但新版的hive已經(jīng)對小表JOIN大表和大表JOIN小表進(jìn)行了優(yōu)化砸喻。小表放在左邊和右邊已經(jīng)沒有明顯區(qū)別柔逼。

不過在做join的過程中通過小表在前可以適當(dāng)?shù)臏p少數(shù)據(jù)量,提高效率割岛。

5愉适、數(shù)據(jù)傾斜,數(shù)據(jù)傾斜的原理都知道癣漆,就是某一個或幾個key占據(jù)了整個數(shù)據(jù)的90%维咸,這樣整個任務(wù)的效率都會被這個key的處理拖慢,同時也可能會因為相同的key會聚合到一起造成內(nèi)存溢出惠爽。

數(shù)據(jù)傾斜只會發(fā)生在shuffle過程中癌蓖。這里給大家羅列一些常用的并且可能會觸發(fā)shuffle操作的算子:distinct、

groupByKey婚肆、reduceByKey租副、aggregateByKey、join较性、cogroup用僧、repartition等。出現(xiàn)數(shù)據(jù)傾斜時赞咙,

可能就是你的代碼中使用了這些算子中的某一個所導(dǎo)致的责循。

hive的數(shù)據(jù)傾斜一般的處理方案:

常見的做法,通過參數(shù)調(diào)優(yōu):sethive.map.aggr=true;sethive.groupby.skewindata=ture;當(dāng)選項設(shè)定為true時攀操,生成的查詢計劃有兩個MapReduce任務(wù)院仿。在第一個MapReduce中,map的輸出結(jié)果集合會隨機(jī)分布到reduce中速和,每個reduce做部分聚合操作意蛀,并輸出結(jié)果耸别。這樣處理的結(jié)果是,相同的GroupByKey有可能分發(fā)到不同的reduce中县钥,從而達(dá)到負(fù)載均衡的目的秀姐;第二個MapReduce任務(wù)再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照GroupByKey分布到reduce中(這個過程可以保證相同的GroupByKey分布到同一個reduce中),最后完成最終的聚合操作若贮。但是這個處理方案對于我們來說是個黑盒省有,無法把控。一般處理方案是將對應(yīng)的key值打散即可谴麦。例如:selecta.*fromtest1aleftjointest2bona.uid=b.uidwherea.ds='2020-08-10'andb.ds='2020-08-10'如果有90%的key都是null蠢沿,這樣不可避免的出現(xiàn)數(shù)據(jù)傾斜。selecta.uidfromtest1asajoin(selectcasewhenuidisnullthencast(rand(1000000)asint)elseuidfromtest2whereds='2020-08-10')bona.uid=b.uidwherea.ds='2020-08-10'當(dāng)然這種只是理論上的處理方案匾效。正常的方案是null進(jìn)行過濾舷蟀,但是日常情況下不是這中特殊的key。那么在日常需求的情況下如何處理這種數(shù)據(jù)傾斜的情況呢:1面哼、sample采樣野宜,獲取哪些集中的key;2魔策、將集中的key按照一定規(guī)則添加隨機(jī)數(shù)匈子;3、進(jìn)行join闯袒,由于打散了虎敦,所以數(shù)據(jù)傾斜避免了;4政敢、在處理結(jié)果中對之前的添加的隨機(jī)數(shù)進(jìn)行切分其徙,變成原始的數(shù)據(jù);

當(dāng)然這些優(yōu)化都是針對SQL本身的優(yōu)化喷户,還有一些是通過參數(shù)設(shè)置去調(diào)整的擂橘,這里面就不再詳細(xì)描述了。

但是優(yōu)化的核心思想都差不多:

減少數(shù)據(jù)量摩骨;

避免數(shù)據(jù)傾斜;

減少JOB數(shù)朗若;

虛核心點:根據(jù)業(yè)務(wù)邏輯對業(yè)務(wù)實現(xiàn)的整體進(jìn)行優(yōu)化恼五;

虛解決方案:采用presto、impala等專門的查詢引擎哭懈,采用spark計算引擎替換MR/TEZ灾馒;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遣总,隨后出現(xiàn)的幾起案子睬罗,更是在濱河造成了極大的恐慌轨功,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件容达,死亡現(xiàn)場離奇詭異古涧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)花盐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門羡滑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人算芯,你說我怎么就攤上這事柒昏。” “怎么了熙揍?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵职祷,是天一觀的道長。 經(jīng)常有香客問我届囚,道長有梆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任奖亚,我火速辦了婚禮淳梦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昔字。我一直安慰自己爆袍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布作郭。 她就那樣靜靜地躺著陨囊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夹攒。 梳的紋絲不亂的頭發(fā)上蜘醋,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天,我揣著相機(jī)與錄音咏尝,去河邊找鬼压语。 笑死,一個胖子當(dāng)著我的面吹牛编检,可吹牛的內(nèi)容都是我干的胎食。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼允懂,長吁一口氣:“原來是場噩夢啊……” “哼厕怜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤粥航,失蹤者是張志新(化名)和其女友劉穎琅捏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递雀,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡柄延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了映之。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拦焚。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖杠输,靈堂內(nèi)的尸體忽然破棺而出赎败,到底是詐尸還是另有隱情,我是刑警寧澤蠢甲,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布僵刮,位于F島的核電站,受9級特大地震影響鹦牛,放射性物質(zhì)發(fā)生泄漏搞糕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一曼追、第九天 我趴在偏房一處隱蔽的房頂上張望窍仰。 院中可真熱鬧,春花似錦礼殊、人聲如沸驹吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碟狞。三九已至,卻和暖如春婚陪,著一層夾襖步出監(jiān)牢的瞬間族沃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工泌参, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留脆淹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓沽一,卻偏偏與公主長得像盖溺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子锯玛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

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