Hive調(diào)優(yōu)技巧

1.Fetch抓取

set hive.fetch.task.conversion=more(默認(rèn))
1

Fetch 抓取是指,Hive 中對(duì)某些情況的查詢可以不必使用 MapReduce 計(jì)算。
該屬性設(shè)置為 more 以后,在全局查找、字段查找、limit 查找等都不走 MapReduce。 設(shè)置為none后所有類型的查找語句都要走M(jìn)apReduce;

創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的廣靈網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

2.本地模式

set hive.exec.mode.local.auto=true(開啟本地模式)
1

Hive 可以通過本地模式在單臺(tái)機(jī)器上 處理所有的任務(wù)。對(duì)于小數(shù)據(jù)集,執(zhí)行時(shí)間可以明顯被縮短
1.開啟本地模式后需要設(shè)置local mr的最大輸入數(shù)據(jù)量,當(dāng)數(shù)據(jù)量小于這個(gè)值時(shí)采用local mr的方式

set hive.exec.mode.local.auto.inputbytes.max=134217728(默認(rèn))
1

2.開啟本地模式后需要設(shè)置local mr的最大輸入文件個(gè)數(shù),當(dāng)數(shù)據(jù)量小于這個(gè)值時(shí)采用local mr的方式

set hive.exec.mode.local.auto.input.files.max=4(默認(rèn))
1

3.表的優(yōu)化

3.1小表join大表 (小表需要在左邊.)

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

3.2大表join大表

當(dāng)一個(gè)表內(nèi)有許多空值時(shí)會(huì)導(dǎo)致MapReduce過程中,空成為一個(gè)key值,對(duì)應(yīng)的會(huì)有大量的value值, 而一個(gè)key的value會(huì)一起到達(dá)reduce造成內(nèi)存不足;所以要想辦法過濾這些空值.
1.通過查詢所有不為空的結(jié)果

   insert overwrite table jointable select n.* from 
   (select * from nullidtable where id is not null ) n left join ori o on n.id = o.id;
12

2.查詢出空值并給其賦上隨機(jī)數(shù),避免了key值為空

insert overwrite table jointable
select n.* from nullidtable n full join ori o on 
case when n.id is null then concat('hive', rand()) else n.id end = o.id;
123

注:此方法可以解決數(shù)據(jù)傾斜的問題

3.3MapJoin

如果不指定 MapJoin 或者不符合 MapJoin 的條件,那么 Hive 解析器會(huì)將 Join 操作轉(zhuǎn)換成 Common Join,即:在 Reduce 階段完成 join。容易發(fā)生數(shù)據(jù)傾斜??梢杂?MapJoin 把小 表全部加載到內(nèi)存在 map 端進(jìn)行 join,避免 reducer 處理。

設(shè)置MapJoin

set hive.auto.convert.join = true(默認(rèn))
1

大表小表的閥門值設(shè)置(默認(rèn)25M以下認(rèn)為是小表):

 set hive.mapjoin.smalltable.filesize=25000000;
1

3.4Group BY

默認(rèn)情況下,Map 階段同一 Key 數(shù)據(jù)分發(fā)給一個(gè) reduce,當(dāng)一個(gè) key 數(shù)據(jù)過大時(shí)就傾斜了并不是所有聚合都在reduce端完成,很多聚合操作都可以現(xiàn)在Map端進(jìn)行部分聚合,最后在Reduce段得到結(jié)果

開啟Map端聚合參數(shù)設(shè)置
是否在Map段進(jìn)行聚合,默認(rèn)為true

hive.map.aggr = true
1

在Map端進(jìn)行聚合操作的條目數(shù)

hive.groupby.mapaggr.checkinterval = 100000
1

有數(shù)據(jù)傾斜的時(shí)候進(jìn)行負(fù)載均衡(默認(rèn)是false)

hive.groupby.skewindata = true
1

注:當(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 By Key 分布到 Reduce 中(這個(gè)過程可以 保證相同的 Group By Key 被分布到同一個(gè) Reduce 中),最后完成最終的聚合操作。

3.5Count(Distinct)去重統(tǒng)計(jì)

Count Distinct是使用了一個(gè)mapreduce ,當(dāng)數(shù)據(jù)較少時(shí)無影響當(dāng)數(shù)據(jù)較大時(shí) 只使用一個(gè)MapReduce將很難完成job。這是需要用到分組 Group BY 會(huì)使用2個(gè)MapReduce完成因?yàn)樵O(shè)置了 set mapreduce.job.reduces = 5; 所以第一個(gè)MapReduce的過程是通過一個(gè)map和5個(gè)reduce來完成這樣減輕了reduce的負(fù)載, 雖然會(huì)多用一個(gè) Job 來完成,但在數(shù)據(jù)量大的情況下,這個(gè)絕對(duì)是值得的。

3.6行列過濾

  • 列處理: 在select中,只拿需要的列,盡量使用分區(qū)過濾,少用select*
  • 行處理: 在分區(qū)剪裁中,當(dāng)使用外關(guān)聯(lián)時(shí),如果將副表的過濾條件寫在where后面那么就會(huì)先全表關(guān)聯(lián),之后再過濾。

實(shí)例:
1.測(cè)試先關(guān)聯(lián)兩張表,再用 where 條件過濾

hive (default)> select o.id from bigtable bjoin ori o on o.id = b.idwhere o.id <= 10;
1

2.通過子查詢后,再關(guān)聯(lián)表

hive (default)> select b.id from bigtable b join (select id from ori where id <= 10 ) o on b.id = o.id;
1

3.7.動(dòng)態(tài)分區(qū)

關(guān)系型數(shù)據(jù)庫(kù)中,對(duì)分區(qū)表 Insert 數(shù)據(jù)時(shí)候,數(shù)據(jù)庫(kù)自動(dòng)會(huì)根據(jù)分區(qū)字段的值,將數(shù)據(jù)插入到相應(yīng)的分區(qū)中,Hive 中也提供了類似的機(jī)制,即動(dòng)態(tài)分區(qū)(Dynamic Partition),只不過,使用 Hive 的動(dòng)態(tài)分區(qū),需要進(jìn)行相應(yīng)的配置。
首先要設(shè)置的屬性

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.max.dynamic.partitions = 1000;
set hive.exec.max.dynamic.partitions.pernode = 100;
set hive.exec.max.created.files = 100000;
set hive.error.on.empty.partition = false;
123456

模擬動(dòng)態(tài)分區(qū)

 insert overwrite table ori_partitioned_target partition (p_time)
select id, time, uid, keyword, url_rank, click_num, click_url, p_time from ori_partitioned;
12

4.數(shù)據(jù)傾斜

4.1合理設(shè)置Map數(shù)

設(shè)置切片值

set mapreduce.input.fileinputformat.split.maxsize=???
1

4.2小文件進(jìn)行合并

在 map 執(zhí)行前合并小文件,減少 map 數(shù):CombineHiveInputFormat 具有對(duì)小文件進(jìn)行
合并的功能(系統(tǒng)默認(rèn)的格式)。HiveInputFormat 沒有對(duì)小文件合并功能。

set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
1

4.3復(fù)雜文件增加Map數(shù)

 set mapreduce.job.maps =???
1

4.4合理設(shè)置Reduce數(shù)

1.調(diào)整reduce的個(gè)數(shù)方法一
每個(gè)Reduce處理的數(shù)據(jù)默認(rèn)是256MB

hive.exec.reducers.bytes.per.reducer=256000000
1

每個(gè)任務(wù)最大的reduce數(shù),默認(rèn)為1009

hive.exec.reducers.max=1009
1

計(jì)算reduce數(shù)的公式

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

2.調(diào)整reduce個(gè)數(shù)的方法二

set mapreduce.job.reduces=???
1

3.reduce個(gè)數(shù)不是越多越好

  • 過多的啟動(dòng)和初始化 reduce 也會(huì)消耗時(shí)間和資源;
  • 另外,有多少個(gè) reduce,就會(huì)有多少個(gè)輸出文件,如果生成了很多個(gè)小文件,那么如果這些小文件作為下一個(gè)任務(wù)的輸入,則也會(huì)出現(xiàn)小文件過多的問題;在設(shè)置 reduce 個(gè)數(shù)的時(shí)候也需要考慮這兩個(gè)原則:處理大數(shù)據(jù)量利用合適的 reduce 數(shù);使單個(gè) reduce 任務(wù)處理數(shù)據(jù)量大小要合適;

4.5并行執(zhí)行

通過設(shè)置參數(shù) hive.exec.parallel 值為 true,就可以開啟并發(fā)執(zhí)行。不過,在共享集群中,需要注意下,如果 job 中并行階段增多,那么集群利用率就會(huì)增加。

set hive.exec.parallel=true; //打開任務(wù)并行執(zhí)行
set hive.exec.parallel.thread.number=16; //同一個(gè) sql 允許最大并行度,默認(rèn)為 8。

網(wǎng)頁題目:Hive調(diào)優(yōu)技巧
文章起源:http://muchs.cn/article10/ighcgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)定制開發(fā)、網(wǎng)站導(dǎo)航、響應(yīng)式網(wǎng)站、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)