您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)Hive怎樣調(diào)優(yōu),小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
Fectch 抓取是指對某些情況下的查詢不必使用 MapReduce 計算
將 hive.fetch.task.conversion 設(shè)置成 more,在全局查找、字段查找、limit查找等都不走 MapReduce
多數(shù)的 Hadoop Job 是需要 Hadoop 提供的完整的可擴(kuò)展性來處理大數(shù)據(jù)集的,不過,有時 Hive 的輸入數(shù)據(jù)量是非常小的,在這種情況下,為查詢觸發(fā)執(zhí)行任務(wù)消耗的時間可能會比實(shí)際job的執(zhí)行時間要多的多,對于大多數(shù)這種情況,Hive 可以通過本地模式在單臺機(jī)器上處理所有的任務(wù),對于小數(shù)據(jù)集,執(zhí)行時間可以明顯被縮短
將 hive.exec.mode.local.auto 設(shè)置成 true,讓 Hive 在適當(dāng)?shù)臅r候自動啟動這個優(yōu)化
有時 JOIN 超時是因為某些 KEY 對應(yīng)的數(shù)據(jù)太多,而相同 KEY 對應(yīng)的數(shù)據(jù)都會發(fā)送到相同的 Reducer 上,從而導(dǎo)致內(nèi)存不夠,此時我們應(yīng)該仔細(xì)分很多情況下,這些 KEY 對應(yīng)的數(shù)據(jù)是異常數(shù)據(jù),我們需要在 SQL 語句中進(jìn)行過濾。
有時雖然某個 KEY 為空對應(yīng)的數(shù)據(jù)很多,但是相應(yīng)的數(shù)據(jù)不是異常數(shù)據(jù),必須要包含在 JOIN 的結(jié)果中,此時我們可以將表中 KEY 為空的字段賦一個隨機(jī)的值,使得數(shù)據(jù)隨機(jī)均勻地分不到不同的 Reducer 上。
如果不指定 MapJOIN 或者不符合 MapJOIN 的條件,那么 Hive 解析器會將 JOIN 轉(zhuǎn)換成 Common JOIN,即:在Reduce階段完成 JOIN,容易發(fā)生數(shù)據(jù)傾斜,可以用 MapJOIN 把小表加載到內(nèi)存在 Map 端進(jìn)行 JOIN,避 Reducer 處理。
默認(rèn)情況下,Map階段同一Key數(shù)據(jù)分發(fā)給一個reduce,當(dāng)一個key數(shù)據(jù)過大時就傾斜了
# 是否在Map端進(jìn)行聚合 set hive.map.aggr = true # 在Map端進(jìn)行聚合操作的條目數(shù)目 set hive.groupby.mapaggr.checkinterval = 100000 # 有數(shù)據(jù)傾斜的時候進(jìn)行負(fù)載均衡 set hive.groupby.skewindata = true
當(dāng)選項設(shè)定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結(jié)果會隨機(jī)分布到 Reduce 中,每個 Reduce 做部分聚合操作,并輸出結(jié)果,這樣處理的結(jié)果是相同的 Group By Key 有可能被分發(fā)到不同的 Reduce中,從而達(dá)到負(fù)載均衡的目的,第二個 MR Job 再根據(jù)預(yù)處理的數(shù)據(jù)結(jié)果按照 Group By Key 分布到 Reduce中(這個過程可以保證相同的 Group By Key 被分布到同一個 Reduce 中),最后完成最終的聚合操作
數(shù)據(jù)量小的時候無所謂,數(shù)據(jù)量大的情況下,由于 COUNT DISTINCT 的全聚合操作,即使設(shè)定了 Reduce Task 個數(shù),Hive 也只會啟動一個Reduce,這就造成一個 Reduce 處理的數(shù)據(jù)量太大,導(dǎo)致整個 Job 很難完成,一般 COUNT DISTINCT 使用先 GROUP BY 再 COUNT 的方式替換
不使用笛卡爾積
禁止使用 SELECT *
對分區(qū)表Insert數(shù)據(jù)時候,數(shù)據(jù)庫自動會根據(jù)分區(qū)字段的值,將數(shù)據(jù)插入到相應(yīng)的分區(qū)中,即動態(tài)分區(qū)
# 開啟動態(tài)分區(qū)功能 hive.exec.dynamic.partition=true # 設(shè)置為非嚴(yán)格模式 hive.exec.dynamic.partition.mode=nonstrict # 在所有執(zhí)行MR的節(jié)點(diǎn)上,最大一共可以創(chuàng)建多少個動態(tài)分區(qū),默認(rèn)1000 hive.exec.max.dynamic.partitions=1000 # 在每個執(zhí)行MR的節(jié)點(diǎn)上,最大可以創(chuàng)建多少個動態(tài)分區(qū),該參數(shù)需要根據(jù)實(shí)際的數(shù)據(jù)來設(shè)定 hive.exec.max.dynamic.partitions.pernode=100 # 整個MR Job中,最大可以創(chuàng)建多少個HDFS文件,默認(rèn)100000 hive.exec.max.created.files=100000 # 當(dāng)有空分區(qū)生成時,是否拋出異常。一般不需要設(shè)置 hive.error.on.empty.partition=false
當(dāng) input 的文件都很大,任務(wù)邏輯復(fù)雜,Map 執(zhí)行非常慢的時候,可以考慮增加 Map 數(shù),來使得每個 Map 處理的數(shù)據(jù)量減少,從而提高任務(wù)的執(zhí)行效率
在 Map 執(zhí)行前合并小文件,減少 Map 數(shù):
set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
在 Map-Reduce 的任務(wù)結(jié)束時合并小文件的設(shè)置
# 在 map-only 任務(wù)結(jié)束時合并小文件 SET hive.merge.mapfiles = true; # 在Map-Reduce任務(wù)結(jié)束時合并小文件 SET hive.merge.mapredfiles = true; # 合并文件的大小,默認(rèn)256M SET hive.merge.size.per.task = 268435456; # 當(dāng)輸出文件的平均大小小于該值時,啟動一個獨(dú)立的Map-Reduce任務(wù)進(jìn)行文件merge SET hive.merge.smallfiles.avgsize = 16777216;
# 每個Reduce處理的數(shù)據(jù)量默認(rèn)是256MB hive.exec.reducers.bytes.per.reducer=256000000 # 每個任務(wù)最大的Reduce數(shù),默認(rèn)為1009 hive.exec.reducers.max=1009 # 計算Reduce數(shù)的公式 N=min(hive.exec.reducers.max, 數(shù)據(jù)總量/hive.exec.reducers.bytes.per.reducer)
Hive 會將一個查詢轉(zhuǎn)化成一個或者多個階段,這樣的階段可以是 MapReduce 階段、抽樣階段、合并階段、limit 階段,或者 Hive 執(zhí)行過程中可能需要的其他階段,默認(rèn)情況下,Hive 一次只會執(zhí)行一個階段,不過,某個特定的 job 可能包含眾多的階段,而這些階段可能并非完全互相依賴的,也就是說有些階段是可以并行執(zhí)行的,這樣可能使得整個 job 的執(zhí)行時間縮短。不過,如果有更多的階段可以并行執(zhí)行,那么 job 可能就越快完成。
通過設(shè)置參數(shù) hive.exec.parallel 值為 true,就可以開啟并發(fā)執(zhí)行。不過,在共享集群中,需要注意下,如果 job 中并行階段增多,那么集群利用率就會增加。
Hive 提供了一個嚴(yán)格模式,可以防止用戶執(zhí)行那些可能意想不到的不好的影響的查詢
開啟嚴(yán)格模式需要修改 hive.mapred.mode 值為 strict,開啟嚴(yán)格模式可以禁止 種類型的查詢:
對于分區(qū)表,除非where語句中含有分區(qū)字段過濾條件來限制范圍,否則不允許執(zhí)行
對于使用了order by語句的查詢,要求必須使用limit語句
限制笛卡爾積的查詢
JVM 重用是 Hadoop 調(diào)優(yōu)參數(shù)的內(nèi)容,其對 Hive 的性能具有非常大的影響,特別是對于很難避免小文件的場景或 task 特別多的場景,這類場景大多數(shù)執(zhí)行時間都很短。
Hadoop 的默認(rèn)配置通常是使用派生來執(zhí)行和任務(wù)的,這時的啟動過程可能會造成相當(dāng)大的開銷,尤其是執(zhí)行的包含有成百上千任務(wù)的情況。
重用可以使得實(shí)例在同一個中重新使用多次。
需要在 Hadoop 的 mapred-site.xml 中配置,但是有個缺點(diǎn)是重用次數(shù)過大,會產(chǎn)生大量的垃圾
<property> <name>mapreduce.job.jvm.numtasks</name> <value>10</value> <description>How many tasks to run per jvm. If set to -1, there is no limit. </description> </property>
如果用戶因為輸入數(shù)據(jù)量很大而需要執(zhí)行長時間的 Map 或者 Reduce Task 的話,那么啟動推測執(zhí)行造成的浪費(fèi)是非常巨大大
關(guān)于“Hive怎樣調(diào)優(yōu)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。