溫馨提示×

溫馨提示×

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

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

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

發(fā)布時間:2021-12-10 11:41:05 來源:億速云 閱讀:182 作者:小新 欄目:大數(shù)據(jù)

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

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

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

1.架構(gòu)方面

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

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

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

在表的設(shè)計上優(yōu)化,比如選擇分區(qū)表,分桶表,以及表的存儲格式,為了減少數(shù)據(jù)傳輸,可以使用壓縮的方式,下面給幾個參數(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)化,其實上面架構(gòu)部分,有部分也是通過參數(shù)來控制的,這一部分的參數(shù)控制主要有下面幾個方面

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

2.1 本地模式

當數(shù)據(jù)量較小的時候,啟動分布式處理數(shù)據(jù)會比較慢,啟動時間較長,不如本地模式快,用下面的參數(shù)來調(diào)整

SET hive.exec.mode.local.auto=true; -- 默認 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; -- 默認 4  map任務(wù)的數(shù)量小于 hive.exec.mode.local.auto.input.files.max 配置的
大小

2.2 嚴格模式

這其實是個開關(guān),滿足下面三個語句時候,就會失敗,如果不開啟就正常執(zhí)行,開啟后就讓這些語句自動失敗

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

2.3 Jvm重用

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

SET mapreduce.job.jvm.numtasks=5;

2.4 并行執(zhí)行

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

SET hive.exec.parallel=true; -- 默認false
SET hive.exec.parallel.thread.number=16; -- 默認8

2.5 推測執(zhí)行

這個參數(shù)的作用是,使用空間資源來換取得到最終結(jié)果的時間,比如由于網(wǎng)絡(luò),資源不均等原因,某些任務(wù)運行特別慢,會啟動備份進程處理同一份數(shù)據(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í)行前面,先合并小文件來減少map數(shù)

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

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

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

2.7 Fetch模式

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

hive.fetch.task.conversion=more

3.sql優(yōu)化

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

3.1 sql優(yōu)化

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

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

3.2 傾斜均衡配置項

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

3.3 單獨處理傾斜key

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

4.兩個SQL

4.1 找出全部奪得3連貫的隊伍

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 找出每個id在在一天之內(nèi)所有的波峰與波谷值

波峰: 這一時刻的值 > 前一時刻的值 這一時刻的值 > 后一時刻的值 波谷: 這一時刻的值 < 前一時刻的值 這一時刻的值 < 后一時刻的值 id time price 前一時刻的值(lag) 后一時刻的值(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)鍵是找到波峰波谷的特征
-- 波峰的特征: 大于前一個時間段、后一個時間段的值
-- 波谷的特征: 小于前一個時間段、后一個時間段的值
-- 找到這個特征SQL就好寫了

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中常見調(diào)優(yōu)方式有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責(zé)聲明:本站發(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)容。

AI