Hive中常見(jiàn)調(diào)優(yōu)方式有哪些

這篇文章給大家分享的是有關(guān)Hive中常見(jiàn)調(diào)優(yōu)方式有哪些的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

成都創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷,提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)站開(kāi)發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷、微信小程序、公眾號(hào)商城、等建站開(kāi)發(fā),成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。

Hive作為大數(shù)據(jù)領(lǐng)域常用的數(shù)據(jù)倉(cāng)庫(kù)組件,在設(shè)計(jì)和開(kāi)發(fā)階段需要注意效率。影響Hive效率的不僅僅是數(shù)據(jù)量過(guò)大;數(shù)據(jù)傾斜、數(shù)據(jù)冗余、job或I/O過(guò)多、MapReduce分配不合理等因素都對(duì)Hive的效率有影響。對(duì)Hive的調(diào)優(yōu)既包含對(duì)HiveQL語(yǔ)句本身的優(yōu)化,也包含Hive配置項(xiàng)和MR方面的調(diào) 整。

從以下三個(gè)方面展開(kāi): 架構(gòu)優(yōu)化 參數(shù)優(yōu)化 SQL優(yōu)化

1.架構(gòu)方面

執(zhí)行引擎方面針對(duì)公司內(nèi)平臺(tái)的資源,選擇更合適的更快的引擎,比如MR、TEZ、Spark等,

如果選擇是TEZ引擎,可以在優(yōu)化器時(shí)候開(kāi)啟向量化的優(yōu)化器,另外可以選擇成本優(yōu)化器CBO,配置分別如下:

set hive.vectorized.execution.enabled = true; -
- 默認(rèn) false
set hive.vectorized.execution.reduce.enabled = true; -
- 默認(rèn) false
SET hive.cbo.enable=true; --從 v0.14.0默認(rèn)
true
SET hive.compute.query.using.stats=true; -- 默認(rèn)false
SET hive.stats.fetch.column.stats=true; -- 默認(rèn)false
SET hive.stats.fetch.partition.stats=true; -- 默認(rèn)true

在表的設(shè)計(jì)上優(yōu)化,比如選擇分區(qū)表,分桶表,以及表的存儲(chǔ)格式,為了減少數(shù)據(jù)傳輸,可以使用壓縮的方式,下面給幾個(gè)參數(shù)(更多參數(shù)可以查看官網(wǎng))

-- 中間結(jié)果壓縮
SET
hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec ;
-- 輸出結(jié)果壓縮
SET hive.exec.compress.output=true;
SET mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodc

2.參數(shù)優(yōu)化

第二部分是參數(shù)優(yōu)化,其實(shí)上面架構(gòu)部分,有部分也是通過(guò)參數(shù)來(lái)控制的,這一部分的參數(shù)控制主要有下面幾個(gè)方面

本地模式、嚴(yán)格模式、JVM重用、并行執(zhí)行、推測(cè)執(zhí)行、合并小文件、Fetch模式

2.1 本地模式

當(dāng)數(shù)據(jù)量較小的時(shí)候,啟動(dòng)分布式處理數(shù)據(jù)會(huì)比較慢,啟動(dòng)時(shí)間較長(zhǎng),不如本地模式快,用下面的參數(shù)來(lái)調(diào)整

SET hive.exec.mode.local.auto=true; -- 默認(rèn) false 
小
SET hive.exec.mode.local.auto.inputbytes.max=50000000; --輸入文件的大小小于 hive.exec.mode.local.auto.inputbytes.max 配置的大
SET hive.exec.mode.local.auto.input.files.max=5; -- 默認(rèn) 4  map任務(wù)的數(shù)量小于 hive.exec.mode.local.auto.input.files.max 配置的
大小

2.2 嚴(yán)格模式

這其實(shí)是個(gè)開(kāi)關(guān),滿足下面三個(gè)語(yǔ)句時(shí)候,就會(huì)失敗,如果不開(kāi)啟就正常執(zhí)行,開(kāi)啟后就讓這些語(yǔ)句自動(dòng)失敗

hive.mapred.mode=nostrict
 -- 查詢分區(qū)表時(shí)不限定分區(qū)列的語(yǔ)句;
 -- 兩表join產(chǎn)生了笛卡爾積的語(yǔ)句;
 -- 用order by來(lái)排序,但沒(méi)有指定limit的語(yǔ)句

2.3 Jvm重用

在mr里面,是以進(jìn)程為單位的,一個(gè)進(jìn)程就是一個(gè)Jvm,其實(shí)像短作業(yè),這些進(jìn)程能夠重用就會(huì)很快,但是它的缺點(diǎn)是會(huì)等任務(wù)執(zhí)行完畢后task插槽,這個(gè)在數(shù)據(jù)傾斜時(shí)候較為明顯。開(kāi)啟這個(gè)使用下面的參數(shù)

SET mapreduce.job.jvm.numtasks=5;

2.4 并行執(zhí)行

Hive的查詢會(huì)轉(zhuǎn)為stage,這些stage并不是相互依賴的,可以并行執(zhí)行這些stage,使用下面的參數(shù)

SET hive.exec.parallel=true; -- 默認(rèn)false
SET hive.exec.parallel.thread.number=16; -- 默認(rèn)8

2.5 推測(cè)執(zhí)行

這個(gè)參數(shù)的作用是,使用空間資源來(lái)?yè)Q取得到最終結(jié)果的時(shí)間,比如由于網(wǎng)絡(luò),資源不均等原因,某些任務(wù)運(yùn)行特別慢,會(huì)啟動(dòng)備份進(jìn)程處理同一份數(shù)據(jù),并最終選用最先成功的計(jì)算結(jié)果作為最終結(jié)果。

set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true
set hive.mapred.reduce.tasks.speculative.execution=true

2.6 合并小文件

在map執(zhí)行前面,先合并小文件來(lái)減少map數(shù)

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

在任務(wù)結(jié)束后,合并小文件

# 在 map-only 任務(wù)結(jié)束時(shí)合并小文件,默認(rèn)true
SET hive.merge.mapfiles = true;
# 在 map-reduce 任務(wù)結(jié)束時(shí)合并小文件,默認(rèn)false
SET hive.merge.mapredfiles = true;
# 合并文件的大小,默認(rèn)256M
SET hive.merge.size.per.task = 268435456;
# 當(dāng)輸出文件的平均大小小于該值時(shí),啟動(dòng)一個(gè)獨(dú)立的map-reduce任務(wù)進(jìn)行文件merge
SET hive.merge.smallfiles.avgsize = 16777216;

2.7 Fetch模式

最后一種fetch模式,則是在某些情況下盡量不跑mr,比如查詢幾個(gè)字段,全局查找,字段查,limit查等情況

hive.fetch.task.conversion=more

3.sql優(yōu)化

這一部分較復(fù)雜,可能涉及到數(shù)據(jù)傾斜問(wèn)題,至于數(shù)據(jù)傾斜問(wèn)題一直是大數(shù)據(jù)處理的不可比避免的一個(gè)問(wèn)題,處理方式也較多

3.1 sql優(yōu)化

sql優(yōu)化是開(kāi)發(fā)人員最容易控制的部分,往往是經(jīng)驗(yàn)使之,大約總結(jié)一下又下面的方式

列,分區(qū)拆解,sort by 代替 order by, group by 代替count(distinct) ,group by的預(yù)聚合(通過(guò)參數(shù)來(lái)控制),傾斜配置項(xiàng),map join,單獨(dú)過(guò)濾空值,適當(dāng)調(diào)整map 和 reduces數(shù),這些在工作中幾乎都會(huì)碰到,盡可能去優(yōu)化他們呢是你要做的

3.2 傾斜均衡配置項(xiàng)

這個(gè)配置與 group by 的傾斜均衡配置項(xiàng)異曲同工,通過(guò) hive.optimize.skewjoin來(lái)配置,默認(rèn)false。如果開(kāi)啟了,在join過(guò)程中Hive會(huì)將計(jì)數(shù)超過(guò)閾值 hive.skewjoin.key (默認(rèn)100000)的傾斜key對(duì)應(yīng)的行臨時(shí)寫(xiě)進(jìn)文件中,然后再啟動(dòng)另一個(gè)job做map join生成結(jié)果。通過(guò) hive.skewjoin.mapjoin.map.tasks 參數(shù)還可以控制第二個(gè)job的mapper數(shù)量,默認(rèn)1000

3.3 單獨(dú)處理傾斜key

如果傾斜的 key 有實(shí)際的意義,一般來(lái)講傾斜的key都很少,此時(shí)可以將它們單獨(dú)抽取出來(lái),對(duì)應(yīng)的行單獨(dú)存入臨時(shí)表中,然后打上一個(gè)較小的隨機(jī)數(shù)前綴(比如0~9),最后再進(jìn)行聚合。不要一個(gè)Select語(yǔ)句中,寫(xiě)太多的Join。一定要了解業(yè)務(wù),了解數(shù)據(jù)。(A0-A9)分成多條語(yǔ)句,分步執(zhí)行;(A0-A4; A5-A9);先執(zhí)行大表與小表的關(guān)聯(lián);

4.兩個(gè)SQL

4.1 找出全部奪得3連貫的隊(duì)伍

team,year 活塞,1990 公牛,1991 公牛,1992

--
 -- 1 排名
select team, year, 
row_number() over (partition by team order by year) as rank
  from t1;

-- 2 獲取分組id
select team, year, 
row_number() over (partition by team order by year) as rank,
(year -row_number() over (partition by team order by year)) as groupid
  from t1;

-- 3 分組求解
select team, count(1) years
  from (select team, 
        (year -row_number() over (partition by team order by year)) as groupid
          from t1
       ) tmp
group by team, groupid
having count(1) >= 3;

4.2 找出每個(gè)id在在一天之內(nèi)所有的波峰與波谷值

波峰: 這一時(shí)刻的值 > 前一時(shí)刻的值 這一時(shí)刻的值 > 后一時(shí)刻的值 波谷: 這一時(shí)刻的值 < 前一時(shí)刻的值 這一時(shí)刻的值 < 后一時(shí)刻的值 id time price 前一時(shí)刻的值(lag) 后一時(shí)刻的值(lead) sh76688, 9:35, 29.48 null 28.72 sh76688, 9:40, 28.72 29.48 27.74 sh76688, 9:45, 27.74
sh76688, 9:50, 26.75
sh76688, 9:55, 27.13 sh76688, 10:00, 26.30 sh76688, 10:05, 27.09 sh76688, 10:10, 26.46 sh76688, 10:15, 26.11 sh76688, 10:20, 26.88 sh76688, 10:25, 27.49 sh76688, 10:30, 26.70 sh76688, 10:35, 27.57 sh76688, 10:40, 28.26 sh76688, 10:45, 28.03

-- 思路:關(guān)鍵是找到波峰波谷的特征
-- 波峰的特征: 大于前一個(gè)時(shí)間段、后一個(gè)時(shí)間段的值
-- 波谷的特征: 小于前一個(gè)時(shí)間段、后一個(gè)時(shí)間段的值
-- 找到這個(gè)特征SQL就好寫(xiě)了

select id, time, price,
       case when price > beforeprice and price > afterprice then "波峰"
            when price < beforeprice and price < afterprice then "波谷" end as feature
  from (select id, time, price,
               lag(price) over (partition by id order by time) beforeprice,
               lead(price) over (partition by id order by time) afterprice
          from t2
        )tmp
 where (price > beforeprice and price > afterprice) or
       (price < beforeprice and price < afterprice);

感謝各位的閱讀!關(guān)于“Hive中常見(jiàn)調(diào)優(yōu)方式有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

文章標(biāo)題:Hive中常見(jiàn)調(diào)優(yōu)方式有哪些
分享鏈接:http://muchs.cn/article2/gediic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、建站公司、網(wǎng)頁(yè)設(shè)計(jì)公司、微信公眾號(hào)、關(guān)鍵詞優(yōu)化、虛擬主機(jī)

廣告

聲明:本網(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í)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司