小編給大家分享一下Hive怎么調(diào)優(yōu),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)于2013年開(kāi)始,公司以成都做網(wǎng)站、網(wǎng)站建設(shè)、系統(tǒng)開(kāi)發(fā)、網(wǎng)絡(luò)推廣、文化傳媒、企業(yè)宣傳、平面廣告設(shè)計(jì)等為主要業(yè)務(wù),適用行業(yè)近百種。服務(wù)企業(yè)客戶(hù)上千余家,涉及國(guó)內(nèi)多個(gè)省份客戶(hù)。擁有多年網(wǎng)站建設(shè)開(kāi)發(fā)經(jīng)驗(yàn)。為企業(yè)提供專(zhuān)業(yè)的網(wǎng)站建設(shè)、創(chuàng)意設(shè)計(jì)、宣傳推廣等服務(wù)。 通過(guò)專(zhuān)業(yè)的設(shè)計(jì)、獨(dú)特的風(fēng)格,為不同客戶(hù)提供各種風(fēng)格的特色服務(wù)。
hive調(diào)優(yōu)涉及到sql的調(diào)優(yōu),數(shù)據(jù)傾斜調(diào)優(yōu),小文件問(wèn)題的調(diào)優(yōu),數(shù)據(jù)壓縮的調(diào)優(yōu)等
文件格式與壓縮編碼的選擇對(duì)比
設(shè)置方式
1. map階段輸出數(shù)據(jù)壓縮 ,在這個(gè)階段,優(yōu)先選擇一個(gè)低CPU開(kāi)銷(xiāo)的算法。
set hive.exec.compress.intermediate=trueset mapred.map.output.compression.codec= org.apache.hadoop.io.compress.SnappyCodecset mapred.map.output.compression.codec=com.hadoop.compression.lzo.LzoCodec;
2. 對(duì)最終輸出結(jié)果壓縮
set hive.exec.compress.output=true set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec ## 當(dāng)然,也可以在hive建表時(shí)指定表的文件格式和壓縮編碼
結(jié)論,一般選擇orcfile/parquet + snappy 方式
分區(qū)是將表的數(shù)據(jù)在物理上分成不同的文件夾,以便于在查詢(xún)時(shí)可以精準(zhǔn)指定所要讀取的分區(qū)目錄,從來(lái)降低讀取的數(shù)據(jù)量
分桶是將表數(shù)據(jù)按指定列的hash散列后分在了不同的文件中,將來(lái)查詢(xún)時(shí),hive可以根據(jù)分桶結(jié)構(gòu),快速定位到一行數(shù)據(jù)所在的分桶文件,從來(lái)提高讀取效率
-- 讓可以不走mapreduce任務(wù)的,就不走mapreduce任務(wù)hive> set hive.fetch.task.conversion=more; // 開(kāi)啟任務(wù)并行執(zhí)行 set hive.exec.parallel=true;// 解釋?zhuān)寒?dāng)一個(gè)sql中有多個(gè)job時(shí)候,且這多個(gè)job之間沒(méi)有依賴(lài),則可以讓順序執(zhí)行變?yōu)椴⑿袌?zhí)行(一般為用到union all的時(shí)候) // 同一個(gè)sql允許并行任務(wù)的最大線程數(shù) set hive.exec.parallel.thread.number=8; // 設(shè)置jvm重用// JVM重用對(duì)hive的性能具有非常大的 影響,特別是對(duì)于很難避免小文件的場(chǎng)景或者task特別多的場(chǎng)景,這類(lèi)場(chǎng)景大多數(shù)執(zhí)行時(shí)間都很短。jvm的啟動(dòng)過(guò)程可能會(huì)造成相當(dāng)大的開(kāi)銷(xiāo),尤其是執(zhí)行的job包含有成千上萬(wàn)個(gè)task任務(wù)的情況。set mapred.job.reuse.jvm.num.tasks=10; // 合理設(shè)置reduce的數(shù)目// 方法1:調(diào)整每個(gè)reduce所接受的數(shù)據(jù)量大小set hive.exec.reducers.bytes.per.reducer=500000000; (500M)// 方法2:直接設(shè)置reduce數(shù)量set mapred.reduce.tasks = 20
(1)where條件優(yōu)化
優(yōu)化前(關(guān)系數(shù)據(jù)庫(kù)不用考慮會(huì)自動(dòng)優(yōu)化):
select m.cid,u.id from order m join customer u on( m.cid =u.id )where m.dt='20180808';
優(yōu)化后(where條件在map端執(zhí)行而不是在reduce端執(zhí)行):
select m.cid,u.id from (select * from order where dt='20180818') m join customer u on( m.cid =u.id);
(2)union優(yōu)化
盡量不要使用union (union 去掉重復(fù)的記錄)而是使用 union all 然后在用group by 去重
(3)count distinct優(yōu)化
不要使用count (distinct cloumn) ,使用子查詢(xún)
select count(1) from (select id from tablename group by id) tmp;
(4) 用in 來(lái)代替join
如果需要根據(jù)一個(gè)表的字段來(lái)約束另為一個(gè)表,盡量用in來(lái)代替join . in 要比join 快
select id,name from tb1 a join tb2 b on(a.id = b.id); select id,name from tb1 where id in(select id from tb2);
(5)消滅子查詢(xún)內(nèi)的 group by 、 COUNT(DISTINCT),MAX,MIN??梢詼p少job的數(shù)量。
(6) join 優(yōu)化:
Common/shuffle/Reduce JOIN 連接發(fā)生的階段,發(fā)生在reduce 階段, 適用于大表 連接 大表(默認(rèn)的方式)
Map join :連接發(fā)生在map階段 , 適用于小表 連接 大表
大表的數(shù)據(jù)從文件中讀取
小表的數(shù)據(jù)存放在內(nèi)存中(hive中已經(jīng)自動(dòng)進(jìn)行了優(yōu)化,自動(dòng)判斷小表,然后進(jìn)行緩存)
set hive.auto.convert.join=true;
SMB join
Sort -Merge -Bucket Join 對(duì)大表連接大表的優(yōu)化,用桶表的概念來(lái)進(jìn)行優(yōu)化。在一個(gè)桶內(nèi)發(fā)生笛卡爾積連接(需要是兩個(gè)桶表進(jìn)行join)
set hive.auto.convert.sortmerge.join=true; set hive.optimize.bucketmapjoin = true; set hive.optimize.bucketmapjoin.sortedmerge = true; set hive.auto.convert.sortmerge.join.noconditionaltask=true;
表現(xiàn):任務(wù)進(jìn)度長(zhǎng)時(shí)間維持在99%(或100%),查看任務(wù)監(jiān)控頁(yè)面,發(fā)現(xiàn)只有少量(1個(gè)或幾個(gè))reduce子任務(wù)未完成。因?yàn)槠涮幚淼臄?shù)據(jù)量和其他reduce差異過(guò)大。
原因:某個(gè)reduce的數(shù)據(jù)輸入量遠(yuǎn)遠(yuǎn)大于其他reduce數(shù)據(jù)的輸入量
1)、key分布不均勻
2)、業(yè)務(wù)數(shù)據(jù)本身的特性(存在熱點(diǎn)key)
3)、建表時(shí)考慮不周
4)、某些SQL語(yǔ)句本身就有數(shù)據(jù)傾斜
關(guān)鍵詞 | 情形 | 后果 |
---|---|---|
join | 其中一個(gè)表較小,但是key集中 | 分發(fā)到某一個(gè)或幾個(gè)Reduce上的數(shù)據(jù)遠(yuǎn)高于平均值 |
join | 大表與大表,但是分桶的判斷字段0值或空值過(guò)多 | 這些空值都由一個(gè)reduce處理,非常慢 |
group by | group by 維度過(guò)小,某值的數(shù)量過(guò)多 | 處理某值的reduce非常耗時(shí) |
count distinct | 某特殊值過(guò)多 | 處理此特殊值reduce耗時(shí) |
(1)參數(shù)調(diào)節(jié)
set hive.map.aggr=true // map端聚合,降低傳給reduce的數(shù)據(jù)量set hive.groupby.skewindata=true // 開(kāi)啟hive內(nèi)置的數(shù)傾優(yōu)化機(jī)制
(2) 熟悉數(shù)據(jù)的分布,優(yōu)化sql的邏輯,找出數(shù)據(jù)傾斜的原因。
如果是在groupby中產(chǎn)生了數(shù)據(jù)傾斜,是否可以講groupby的維度變得更細(xì),如果沒(méi)法變得更細(xì),就可以在原分組key上添加隨機(jī)數(shù)后分組聚合一次,然后對(duì)結(jié)果去掉隨機(jī)數(shù)后再分組聚合
在join時(shí),有大量為null的join key,則可以將null轉(zhuǎn)成隨機(jī)值,避免聚集
(3)join的每路輸入都比較大,且長(zhǎng)尾是熱點(diǎn)值導(dǎo)致的,可以對(duì)熱點(diǎn)值和非熱點(diǎn)值分別進(jìn)行處理,再合并數(shù)據(jù)
小文件的產(chǎn)生有三個(gè)地方,map輸入,map輸出,reduce輸出,小文件過(guò)多也會(huì)影響hive的分析效率:
設(shè)置map輸入的小文件合并
set mapred.max.split.size=256000000; //一個(gè)節(jié)點(diǎn)上split的至少的大小(這個(gè)值決定了多個(gè)DataNode上的文件是否需要合并)set mapred.min.split.size.per.node=100000000;//一個(gè)交換機(jī)下split的至少的大小(這個(gè)值決定了多個(gè)交換機(jī)上的文件是否需要合并) set mapred.min.split.size.per.rack=100000000;//執(zhí)行Map前進(jìn)行小文件合并set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
設(shè)置map輸出和reduce輸出進(jìn)行合并的相關(guān)參數(shù):
//設(shè)置map端輸出進(jìn)行合并,默認(rèn)為trueset hive.merge.mapfiles = true//設(shè)置reduce端輸出進(jìn)行合并,默認(rèn)為falseset hive.merge.mapredfiles = true//設(shè)置合并文件的大小set hive.merge.size.per.task = 256*1000*1000//當(dāng)輸出文件的平均大小小于該值時(shí),啟動(dòng)一個(gè)獨(dú)立的MapReduce任務(wù)進(jìn)行文件merge。set hive.merge.smallfiles.avgsize=16000000
explain sql
學(xué)會(huì)查看sql的執(zhí)行計(jì)劃,優(yōu)化業(yè)務(wù)邏輯 ,減少job的數(shù)據(jù)量。對(duì)調(diào)優(yōu)也非常重要
以上是“Hive怎么調(diào)優(yōu)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)頁(yè)標(biāo)題:Hive怎么調(diào)優(yōu)
標(biāo)題鏈接:http://jinyejixie.com/article22/ggsjjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)、網(wǎng)站設(shè)計(jì)公司、動(dòng)態(tài)網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)