您好,登錄后才能下訂單哦!
這篇文章主要介紹了hive上億級別的表關(guān)聯(lián)如何調(diào)優(yōu),具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
環(huán)境:公司決定使用寬表,將10個相關(guān)的大表進行全量關(guān)聯(lián)
(1個上億級別的表,5個上千萬的表,剩下的表都不到百萬的表)
花了兩天的時間研究,測試
例如: a~g這幾個表中,a表為上億級別的表,5個上千萬的表,剩下為表都百萬的表
select a.uesrid,b.citycode,b.register_num, ... ,g.active_num from (select userid,citycode from a) left outer join (select userid,register_num from b) on (a.userid=b.userid) ... left outer join (select userid,active_num from g) on (a.userid=b.userid)
你會發(fā)現(xiàn)
最后一個job異常慢,并且reduce為1。
也多人會說,你傻逼呀,設(shè)置reduce數(shù)呀,對這是一個好辦法,但是結(jié)果如何呢?
#設(shè)置傳輸格式 set mapred.output.compress=true; set hive.exec.compress.output=true; set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; set io.compression.codecs=org.apache.hadoop.io.compress.GzipCodec; #設(shè)置200個reduces set mapred.reduce.tasks=200; #設(shè)置并行(甚至還。。。設(shè)置并行) set hive.exec.parallel=true; set hive.exec.parallel.thread.number=16; //同一個sql允許最大并行度,默認為8
草,我就是按照網(wǎng)上各種教程,測試了一整天,還是最后一個reduce為1;(我可是上億級別噢?。。。?/p>
hive自動分配reduce的計算方法
1. hive.exec.reducers.bytes.per.reducer(默認為1000^3)
2. hive.exec.reducers.max(默認為999)
計算reducer數(shù)的公式很簡單:
N=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)
然后查詢得知:
reduce為1,是因為:
沒有使用group by
使用了order by
笛卡爾積
我TM都使了一遍,還是reduce=1,我當時很無語,就尼瑪不能再做清楚一點嗎?(我可是小白呀?。。。?/p>
時間:3個小時都沒跑完,一直都是83%
所以hadoop,看到了這個語句,就會分配一個reduce
如何欺騙hive分配reduce呢?
然后修改腳本(當然上面的 設(shè)置reduce數(shù) 這個不能少噢)
# 如何欺騙hive多分配reduce select a.uesrid,b.citycode,sum(b.register_num), ... ,sum(g.active_num) # 求聚合函數(shù) from (select userid,citycode from x) # x,y表示這幾個表中最小的一個表 full outer join (select userid,unregister from y) # x,y表示這幾個表中最小的一個表 on (x.userid=y.userid) # (可交替的設(shè)置 y.userid=b.userid) full outer join (select userid,register_num from b) on (x.userid=b.userid) # 關(guān)聯(lián)條件,都用小表進行關(guān)聯(lián) ... right outer join (select userid,active_num from a) # 最大的表放在最后 on (y.userid=a.userid) # (可交替的設(shè)置 y.userid=b.userid) group by a.userid,b.citycode; # 最后進行g(shù)roup by
使用聚合函數(shù),加 group by
然后小表放在前面(有人說:我TM要所有的信息,那你就用全連接唄)
然后大表一般就往后排,從小到大,一順排下來就行
這樣就能欺騙hive分配多個reduce,達到調(diào)優(yōu)的效果
時間:15分鐘不到,興奮到高潮了嗎?哈哈
缺點:
生成200個文件,比較麻煩
設(shè)置并行,對性能要求有點高,所以適度設(shè)置并行數(shù)量就行
并行參數(shù),僅做參考
當參數(shù)為false的時候,三個job是順序的執(zhí)行
set hive.exec.parallel=false;
但是可以看出來其實兩個子查詢中的sql并無關(guān)系,可以并行的跑
set hive.exec.parallel=true;
hive> set hive.exec.parallel.thread.number; (如果機器一般,可以并行設(shè)置3,感覺比較合理)
hive.exec.parallel.thread.number=8 默認并行數(shù)為8
感謝你能夠認真閱讀完這篇文章,希望小編分享的“hive上億級別的表關(guān)聯(lián)如何調(diào)優(yōu)”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。