您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Hive中常見調優方式有哪些的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
Hive作為大數據領域常用的數據倉庫組件,在設計和開發階段需要注意效率。影響Hive效率的不僅僅是數據量過大;數據傾斜、數據冗余、job或I/O過多、MapReduce分配不合理等因素都對Hive的效率有影響。對Hive的調優既包含對HiveQL語句本身的優化,也包含Hive配置項和MR方面的調 整。
從以下三個方面展開: 架構優化 參數優化 SQL優化
執行引擎方面針對公司內平臺的資源,選擇更合適的更快的引擎,比如MR、TEZ、Spark等,
如果選擇是TEZ引擎,可以在優化器時候開啟向量化的優化器,另外可以選擇成本優化器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
在表的設計上優化,比如選擇分區表,分桶表,以及表的存儲格式,為了減少數據傳輸,可以使用壓縮的方式,下面給幾個參數(更多參數可以查看官網)
-- 中間結果壓縮 SET hive.intermediate.compression.codec=org.apache.hadoop.io.compress.SnappyCodec ; -- 輸出結果壓縮 SET hive.exec.compress.output=true; SET mapreduce.output.fileoutputformat.compress.codec =org.apache.hadoop.io.compress.SnappyCodc
第二部分是參數優化,其實上面架構部分,有部分也是通過參數來控制的,這一部分的參數控制主要有下面幾個方面
本地模式、嚴格模式、JVM重用、并行執行、推測執行、合并小文件、Fetch模式
當數據量較小的時候,啟動分布式處理數據會比較慢,啟動時間較長,不如本地模式快,用下面的參數來調整
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任務的數量小于 hive.exec.mode.local.auto.input.files.max 配置的 大小
這其實是個開關,滿足下面三個語句時候,就會失敗,如果不開啟就正常執行,開啟后就讓這些語句自動失敗
hive.mapred.mode=nostrict -- 查詢分區表時不限定分區列的語句; -- 兩表join產生了笛卡爾積的語句; -- 用order by來排序,但沒有指定limit的語句
在mr里面,是以進程為單位的,一個進程就是一個Jvm,其實像短作業,這些進程能夠重用就會很快,但是它的缺點是會等任務執行完畢后task插槽,這個在數據傾斜時候較為明顯。開啟這個使用下面的參數
SET mapreduce.job.jvm.numtasks=5;
Hive的查詢會轉為stage,這些stage并不是相互依賴的,可以并行執行這些stage,使用下面的參數
SET hive.exec.parallel=true; -- 默認false SET hive.exec.parallel.thread.number=16; -- 默認8
這個參數的作用是,使用空間資源來換取得到最終結果的時間,比如由于網絡,資源不均等原因,某些任務運行特別慢,會啟動備份進程處理同一份數據,并最終選用最先成功的計算結果作為最終結果。
set mapreduce.map.speculative=true set mapreduce.reduce.speculative=true set hive.mapred.reduce.tasks.speculative.execution=true
在map執行前面,先合并小文件來減少map數
set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
在任務結束后,合并小文件
# 在 map-only 任務結束時合并小文件,默認true SET hive.merge.mapfiles = true; # 在 map-reduce 任務結束時合并小文件,默認false SET hive.merge.mapredfiles = true; # 合并文件的大小,默認256M SET hive.merge.size.per.task = 268435456; # 當輸出文件的平均大小小于該值時,啟動一個獨立的map-reduce任務進行文件merge SET hive.merge.smallfiles.avgsize = 16777216;
最后一種fetch模式,則是在某些情況下盡量不跑mr,比如查詢幾個字段,全局查找,字段查,limit查等情況
hive.fetch.task.conversion=more
這一部分較復雜,可能涉及到數據傾斜問題,至于數據傾斜問題一直是大數據處理的不可比避免的一個問題,處理方式也較多
sql優化是開發人員最容易控制的部分,往往是經驗使之,大約總結一下又下面的方式
列,分區拆解,sort by 代替 order by, group by 代替count(distinct) ,group by的預聚合(通過參數來控制),傾斜配置項,map join,單獨過濾空值,適當調整map 和 reduces數,這些在工作中幾乎都會碰到,盡可能去優化他們呢是你要做的
這個配置與 group by 的傾斜均衡配置項異曲同工,通過 hive.optimize.skewjoin來配置,默認false。如果開啟了,在join過程中Hive會將計數超過閾值 hive.skewjoin.key (默認100000)的傾斜key對應的行臨時寫進文件中,然后再啟動另一個job做map join生成結果。通過 hive.skewjoin.mapjoin.map.tasks 參數還可以控制第二個job的mapper數量,默認1000
如果傾斜的 key 有實際的意義,一般來講傾斜的key都很少,此時可以將它們單獨抽取出來,對應的行單獨存入臨時表中,然后打上一個較小的隨機數前綴(比如0~9),最后再進行聚合。不要一個Select語句中,寫太多的Join。一定要了解業務,了解數據。(A0-A9)分成多條語句,分步執行;(A0-A4; A5-A9);先執行大表與小表的關聯;
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;
波峰: 這一時刻的值 > 前一時刻的值 這一時刻的值 > 后一時刻的值 波谷: 這一時刻的值 < 前一時刻的值 這一時刻的值 < 后一時刻的值 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
-- 思路:關鍵是找到波峰波谷的特征 -- 波峰的特征: 大于前一個時間段、后一個時間段的值 -- 波谷的特征: 小于前一個時間段、后一個時間段的值 -- 找到這個特征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);
感謝各位的閱讀!關于“Hive中常見調優方式有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。