溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

hive上億級別的表關(guān)聯(lián)怎么調(diào)優(yōu)

發(fā)布時間:2021-12-10 10:26:58 來源:億速云 閱讀:861 作者:小新 欄目:云計(jì)算

這篇文章將為大家詳細(xì)講解有關(guān)hive上億級別的表關(guān)聯(lián)怎么調(diào)優(yōu),小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

環(huán)境:公司決定使用寬表,將10個相關(guān)的大表進(jì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允許最大并行度,默認(rèn)為8


草,我就是按照網(wǎng)上各種教程,測試了一整天,還是最后一個reduce為1;(我可是上億級別噢!?。。?/p>

hive自動分配reduce的計(jì)算方法

1. hive.exec.reducers.bytes.per.reducer(默認(rèn)為1000^3)

2. hive.exec.reducers.max(默認(rèn)為999)

計(jì)算reducer數(shù)的公式很簡單:

N=min(參數(shù)2,總輸入數(shù)據(jù)量/參數(shù)1)


然后查詢得知:

reduce為1,是因?yàn)椋?/p>

  1. 沒有使用group by

  2. 使用了order by

  3. 笛卡爾積

我TM都使了一遍,還是reduce=1,我當(dāng)時很無語,就尼瑪不能再做清楚一點(diǎn)嗎?(我可是小白呀?。。。?/p>


時間:3個小時都沒跑完,一直都是83%


所以hadoop,看到了這個語句,就會分配一個reduce


如何欺騙hive分配reduce呢?

然后修改腳本(當(dāng)然上面的 設(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)條件,都用小表進(jì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;   # 最后進(jìn)行g(shù)roup by


  1. 使用聚合函數(shù),加 group by

  2. 然后小表放在前面(有人說:我TM要所有的信息,那你就用全連接唄)

  3. 然后大表一般就往后排,從小到大,一順排下來就行

這樣就能欺騙hive分配多個reduce,達(dá)到調(diào)優(yōu)的效果


時間:15分鐘不到,興奮到高潮了嗎?哈哈


缺點(diǎn):

  1. 生成200個文件,比較麻煩

  2. 設(shè)置并行,對性能要求有點(diǎn)高,所以適度設(shè)置并行數(shù)量就行


并行參數(shù),僅做參考

當(dāng)參數(shù)為false的時候,三個job是順序的執(zhí)行 

set hive.exec.parallel=false;

但是可以看出來其實(shí)兩個子查詢中的sql并無關(guān)系,可以并行的跑

set hive.exec.parallel=true;

hive> set hive.exec.parallel.thread.number;   (如果機(jī)器一般,可以并行設(shè)置3,感覺比較合理)

hive.exec.parallel.thread.number=8    默認(rèn)并行數(shù)為8


關(guān)于“hive上億級別的表關(guān)聯(lián)怎么調(diào)優(yōu)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI