Hive SQL優(yōu)化之 Count Distinct

Hive是Hadoop的子項(xiàng)目,它提供了對(duì)數(shù)據(jù)的結(jié)構(gòu)化管理和類SQL語言的查詢功能聋袋。SQL的交互方式極大程度地降低了Hadoop生態(tài)環(huán)境中數(shù)據(jù)處理的門檻队伟,用戶不需要編寫程序,通過SQL語句就可以對(duì)數(shù)據(jù)進(jìn)行分析和處理幽勒。目前很多計(jì)算需求都可以由Hive來完成嗜侮,極大程度地降低了開發(fā)成本。

目前啥容,Hive底層使用MapReduce作為實(shí)際計(jì)算框架锈颗,SQL的交互方式隱藏了大部分MapReduce的細(xì)節(jié)。這種細(xì)節(jié)的隱藏在帶來便利性的同時(shí)咪惠,也對(duì)計(jì)算作業(yè)的調(diào)優(yōu)帶來了一定的難度击吱。未經(jīng)優(yōu)化的SQL語句轉(zhuǎn)化后的MapReduce作業(yè),它的運(yùn)行效率可能大大低于用戶的預(yù)期遥昧。本文我們就來分析一個(gè)簡(jiǎn)單語句的優(yōu)化過程姨拥。

日常統(tǒng)計(jì)場(chǎng)景中,我們經(jīng)常會(huì)對(duì)一段時(shí)期內(nèi)的字段進(jìn)行消重并統(tǒng)計(jì)數(shù)量渠鸽,SQL語句類似于

SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...;

這條語句是從一個(gè)表的符合WHERE條件的記錄中統(tǒng)計(jì)不重復(fù)的id的總數(shù)。

該語句轉(zhuǎn)化為MapReduce作業(yè)后執(zhí)行示意圖如下柴罐,圖中還列出了我們實(shí)驗(yàn)作業(yè)中Reduce階段的數(shù)據(jù)規(guī)模:


Hive process 1

由于引入了DISTINCT徽缚,因此在Map階段無法利用combine對(duì)輸出結(jié)果消重,必須將id作為Key輸出革屠,在Reduce階段再對(duì)來自于不同Map Task凿试、相同Key的結(jié)果進(jìn)行消重,計(jì)入最終統(tǒng)計(jì)值似芝。
我們看到作業(yè)運(yùn)行時(shí)的Reduce Task個(gè)數(shù)為1那婉,對(duì)于統(tǒng)計(jì)大數(shù)據(jù)量時(shí),這會(huì)導(dǎo)致最終Map的全部輸出由單個(gè)的ReduceTask處理党瓮。這唯一的Reduce Task需要Shuffle大量的數(shù)據(jù)详炬,并且進(jìn)行排序聚合等處理,這使得它成為整個(gè)作業(yè)的IO和運(yùn)算瓶頸寞奸。
經(jīng)過上述分析后呛谜,我們嘗試顯式地增大Reduce Task個(gè)數(shù)來提高Reduce階段的并發(fā),使每一個(gè)Reduce Task的數(shù)據(jù)處理量控制在2G左右枪萄。具體設(shè)置如下:


set mapred.reduce.tasks=100

調(diào)整后我們發(fā)現(xiàn)這一參數(shù)并沒有影響實(shí)際Reduce Task個(gè)數(shù)隐岛,Hive運(yùn)行時(shí)輸出“Number of reduce tasks determined at compile time: 1”。原來Hive在處理COUNT這種“全聚合(full aggregates)”計(jì)算時(shí)瓷翻,它會(huì)忽略用戶指定的Reduce Task數(shù)聚凹,而強(qiáng)制使用1割坠。我們只能采用變通的方法來繞過這一限制。我們利用Hive對(duì)嵌套語句的支持妒牙,將原來一個(gè)MapReduce作業(yè)轉(zhuǎn)換為兩個(gè)作業(yè)彼哼,在第一階段選出全部的非重復(fù)id,在第二階段再對(duì)這些已消重的id進(jìn)行計(jì)數(shù)单旁。這樣在第一階段我們可以通過增大Reduce的并發(fā)數(shù)沪羔,并發(fā)處理Map輸出。在第二階段象浑,由于id已經(jīng)消重蔫饰,因此COUNT(*)操作在Map階段不需要輸出原id數(shù)據(jù),只輸出一個(gè)合并后的計(jì)數(shù)即可愉豺。這樣即使第二階段Hive強(qiáng)制指定一個(gè)Reduce Task篓吁,極少量的Map輸出數(shù)據(jù)也不會(huì)使單一的Reduce Task成為瓶頸。改進(jìn)后的SQL語句如下:

SELECT COUNT(*) FROM (SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t;

實(shí)際運(yùn)行時(shí)蚪拦,我們發(fā)現(xiàn)Hive還對(duì)這兩階段的作業(yè)做了額外的優(yōu)化杖剪。它將第二個(gè)MapReduce作業(yè)Map中的Count過程移到了第一個(gè)作業(yè)的Reduce階段。這樣在第一階Reduce就可以輸出計(jì)數(shù)值驰贷,而不是消重的全部id盛嘿。這一優(yōu)化大幅地減少了第一個(gè)作業(yè)的Reduce輸出IO以及第二個(gè)作業(yè)Map的輸入數(shù)據(jù)量。最終在同樣的運(yùn)行環(huán)境下優(yōu)化后的語句執(zhí)行只需要原語句20%左右的時(shí)間括袒。優(yōu)化后的MapReduce作業(yè)流如下:

Hive process 2

從上述優(yōu)化過程我們可以看出次兆,一個(gè)簡(jiǎn)單的統(tǒng)計(jì)需求,如果不理解Hive和MapReduce的工作原理锹锰,它可能會(huì)比優(yōu)化后的執(zhí)行過程多四芥炭、五倍的時(shí)間。我們?cè)诶肏ive簡(jiǎn)化開發(fā)的同時(shí)恃慧,也要盡可能優(yōu)化SQL語句园蝠,提升計(jì)算作業(yè)的執(zhí)行效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痢士,一起剝皮案震驚了整個(gè)濱河市彪薛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌良瞧,老刑警劉巖陪汽,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褥蚯,居然都是意外死亡挚冤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門赞庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來训挡,“玉大人澳骤,你說我怎么就攤上這事±奖。” “怎么了为肮?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)肤京。 經(jīng)常有香客問我颊艳,道長(zhǎng),這世上最難降的妖魔是什么忘分? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任棋枕,我火速辦了婚禮,結(jié)果婚禮上妒峦,老公的妹妹穿的比我還像新娘重斑。我一直安慰自己,他們只是感情好肯骇,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布窥浪。 她就那樣靜靜地躺著,像睡著了一般笛丙。 火紅的嫁衣襯著肌膚如雪漾脂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天胚鸯,我揣著相機(jī)與錄音符相,去河邊找鬼。 笑死蠢琳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镜豹。 我是一名探鬼主播傲须,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼趟脂!你這毒婦竟也來了泰讽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤昔期,失蹤者是張志新(化名)和其女友劉穎已卸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硼一,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡累澡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了般贼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片愧哟。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奥吩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蕊梧,到底是詐尸還是另有隱情霞赫,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布肥矢,位于F島的核電站端衰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏甘改。R本人自食惡果不足惜旅东,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楼誓。 院中可真熱鬧玉锌,春花似錦、人聲如沸疟羹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榄融。三九已至参淫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愧杯,已是汗流浹背涎才。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留力九,地道東北人耍铜。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像跌前,于是被迫代替她去往敵國(guó)和親棕兼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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