Apache Hive 通用調(diào)優(yōu)featch抓取機(jī)制 mr本地模式
Apache Hive-通用優(yōu)化-featch抓取機(jī)制 mr本地模式
抓取機(jī)構(gòu)
功能:在執(zhí)行sql的時(shí)候,能不走M(jìn)apReduce程序處理就盡量不走M(jìn)apReduce程序處理.盡量直接去操作數(shù)據(jù)文件。set:hive . fetch . task . conversion = more。
--在下述3種情況下 sql不走mr程序--全局查找select * from student;--字段查找select num,name from student;--limit 查找select num,name from student limit 2;Mapreduce本地模式
MapReduce程序除了可以提交到y(tǒng)arn集群分布式執(zhí)行之外,還可以使用本地模擬環(huán)境運(yùn)行,當(dāng)然此時(shí)就不是分布式執(zhí)行的程序,但是針對(duì)小文件小數(shù)據(jù)處理特別有效果。用戶可以通過(guò)設(shè)置hive.exec.mode.local.auto的值為true,來(lái)讓Hive在適當(dāng)?shù)臅r(shí)候自動(dòng)啟動(dòng)這個(gè) 優(yōu)化。功能:如果必須執(zhí)行==MapReduce程序,如果可以本地執(zhí)行,盡量不要提交給yarn執(zhí)行= =
默認(rèn)情況下,它是關(guān)閉的。意思是只要取MapReduce,就會(huì)提交給yarn執(zhí)行。
mapreduce.framework.name = local 本地模式mapreduce.framework.name = yarn 集群模式Hive提供了一個(gè)參數(shù)來(lái)自動(dòng)將MapReduce程序切換到本地模式。如果條件不滿足,將執(zhí)行紗線模式。
set hive.exec.mode.local.auto = true;--3個(gè)條件必須都滿足 自動(dòng)切換本地模式The total input size of the job is lower than: hive.exec.mode.local.auto.inputbytes.max (128MB by default) --數(shù)據(jù)量小于128MThe total number of map-tasks is less than: hive.exec.mode.local.auto.tasks.max (4 by default) --maptask個(gè)數(shù)少于4個(gè)The total number of reduce tasks required is 1 or 0. --reducetask個(gè)數(shù)是0 或者 1切換配置單元的執(zhí)行引擎
警告:Hive-on-MR已在Hive 2中棄用,在未來(lái)版本中可能不可用。考慮使用不同的執(zhí)行引擎(即spark、tez)或使用Hive 1。x版本。
如果對(duì)Hive的調(diào)優(yōu)仍然不能滿足您的需求或者效率低下,請(qǐng)嘗試使用spark計(jì)算引擎或Tez。
Apache Hive-通用優(yōu)化-join優(yōu)化
在理解連接優(yōu)化的時(shí)候,我們需要知道一個(gè)預(yù)知識(shí)點(diǎn):map-side join和reduce-side join。
-減少側(cè)面連接
這種join的弊端在于map階段沒(méi)有承擔(dān)太多的責(zé)任,所有的數(shù)據(jù)在經(jīng)過(guò)shuffle在reduce階段實(shí)現(xiàn)的,而shuffle又是影響性能的核心點(diǎn).-地圖側(cè)連接
首先啟動(dòng)本地任務(wù)將join中小表數(shù)據(jù)進(jìn)行分布式緩存啟動(dòng)mr程序(只有map階段)并行處理大數(shù)據(jù),并且從自己的緩存中讀取小表數(shù)據(jù),進(jìn)行join,結(jié)果直接輸出到文件中沒(méi)有shuffle過(guò)程 也沒(méi)有reduce過(guò)程弊端:緩存太小導(dǎo)致表數(shù)據(jù)不能太大縮減端連接優(yōu)化
適合大表加入大表
bucket Join——適合大型表連接大型表
1: Bucktet映射連接桶表
語(yǔ)法:clustered by colName
參數(shù):set hive . optimize . bucket map join = true
要求:bucket field = Join field,bucket個(gè)數(shù)等于或?yàn)楸稊?shù),必須在map Join中。
2:排序合并存儲(chǔ)桶連接(SMB)
基于數(shù)據(jù)的有序聯(lián)接
語(yǔ)法:按colname分類按(colname)
參數(shù)
set hive . auto . convert . sort merge . join = true;
set hive . optimize . bucket mapjoin . sorted merge = true;
set hive . auto . convert . sort merge . join . noconditionaltask = true;
要求:桶劃分字段=連接字段=排序字段,桶數(shù)等于或?yàn)楸稊?shù)。
地圖連接優(yōu)化
hive.auto.convert.join.noconditionaltaskhive.auto.convert.join=trueHive老版本#如果參與的一個(gè)表大小滿足條件 轉(zhuǎn)換為map joinhive.mapjoin.smalltable.filesize=25000000 Hive2.0之后版本#是否啟用基于輸入文件的大小,將reduce join轉(zhuǎn)化為Map join的優(yōu)化機(jī)制。假設(shè)參與join的表(或分區(qū))有N個(gè),如果打開(kāi)這個(gè)參數(shù),并且有N-1個(gè)表(或分區(qū))的大小總和小于hive.auto.convert.join.noconditionaltask.size參數(shù)指定的值,那么會(huì)直接將join轉(zhuǎn)為Map join。hive.auto.convert.join.noconditionaltask=true hive.auto.convert.join.noconditionaltask.size=512000000Apache Hive--通用調(diào)優(yōu)--數(shù)據(jù)傾斜優(yōu)化
數(shù)據(jù)偏斜優(yōu)化
一個(gè)任務(wù)的數(shù)據(jù)太多,執(zhí)行時(shí)間太長(zhǎng),導(dǎo)致整個(gè)作業(yè)延遲完成[Div][/Div][Div][/Div]執(zhí)行時(shí)間長(zhǎng)[Div][/Div]出現(xiàn)bug和風(fēng)險(xiǎn)的概率增加
[Div][Div][/Div][Div]Div]長(zhǎng)時(shí)間占用計(jì)算資源
通常如何發(fā)現(xiàn)數(shù)據(jù)偏斜
[Div][Div][/Div][Div][/Div][/Div][Div][/Div]在紗或其他地方?我發(fā)現(xiàn)了某個(gè)進(jìn)度中某個(gè)工卡延遲的原因
[div][div]
1、金錢預(yù)警
[div]。[div]
2 .沒(méi)錢[[/Div][Div][/Div][Div][/Div][Div][/Div]斜向數(shù)據(jù)散射[Div]
[Div][/Div][Div][/Div][Div][/Div]
[Div][Div]
[Div][/Div][Div][/Div][/Div][Div][/Div]處理的結(jié)果最終與
中數(shù)據(jù)傾斜的場(chǎng)景融合count(distinct)
hive . map . aggr = true;
[div]
[Div][/Div][Div][/Div][Div][/Div]場(chǎng)景二:Join
[Div][/Div][Div][/Div]將大數(shù)據(jù)轉(zhuǎn)化為小數(shù)據(jù),實(shí)現(xiàn)Map Join
[Div][/Div][Div][/Div][Div][/Div][/Div][Div][/Div][/Div][Div][/Div][/Div][/Div]使用桶Join
[Div][/Div][Div][/Div][/Div][/Div][/Div][/ 數(shù)據(jù)傾斜的數(shù)據(jù)會(huì)單獨(dú)使用Map Join來(lái)實(shí)現(xiàn)
[div]
解決辦法
群組數(shù)據(jù)傾斜
選項(xiàng)1:打開(kāi)地圖聚合。
hive.map.aggr=true;#是否在Hive Group By 查詢中使用map端聚合。#這個(gè)設(shè)置可以將頂層的部分聚合操作放在Map階段執(zhí)行,從而減輕清洗階段數(shù)據(jù)傳輸和Reduce階段的執(zhí)行時(shí)間,提升總體性能。但是指標(biāo)不治本。方案二:實(shí)現(xiàn)隨機(jī)分區(qū)。
實(shí)現(xiàn)隨機(jī)分區(qū)select * from table distribute by rand();方案三:數(shù)據(jù)傾斜時(shí)= =自動(dòng)負(fù)載均衡= =只使用group by。
hive.groupby.skewindata=true;#開(kāi)啟該參數(shù)以后,當(dāng)前程序會(huì)自動(dòng)通過(guò)兩個(gè)MapReduce來(lái)運(yùn)行#第一個(gè)MapReduce自動(dòng)進(jìn)行隨機(jī)分布到Reducer中,每個(gè)Reducer做部分聚合操作,輸出結(jié)果#第二個(gè)MapReduce將上一步聚合的結(jié)果再按照業(yè)務(wù)(group by key)進(jìn)行處理,保證相同的分布到一起,最終聚合得到結(jié)果加入數(shù)據(jù)傾斜
方案一:提前過(guò)濾,將大數(shù)據(jù)變成小數(shù)據(jù),實(shí)現(xiàn)Map Join方案二:使用Bucket Join方案三:使用Skew Join數(shù)據(jù)是通過(guò)單獨(dú)使用地圖連接實(shí)現(xiàn)的。
#其他沒(méi)有產(chǎn)生數(shù)據(jù)傾斜的數(shù)據(jù)由Reduce Join來(lái)實(shí)現(xiàn),這樣就避免了Reduce Join中產(chǎn)生數(shù)據(jù)傾斜的問(wèn)題#最終將Map Join的結(jié)果和Reduce Join的結(jié)果進(jìn)行Union合并#開(kāi)啟運(yùn)行過(guò)程中skewjoinset hive.optimize.skewjoin=true;#如果這個(gè)key的出現(xiàn)的次數(shù)超過(guò)這個(gè)范圍set hive.skewjoin.key=100000;#在編譯時(shí)判斷是否會(huì)產(chǎn)生數(shù)據(jù)傾斜set hive.optimize.skewjoin.compiletime=true;set hive.optimize.union.remove=true;#如果Hive的底層走的是MapReduce,必須開(kāi)啟這個(gè)屬性,才能實(shí)現(xiàn)不合并set mapreduce.input.fileinputformat.input.dir.recursive=true;Apache Hive--通用調(diào)優(yōu)--MR程序task個(gè)數(shù)調(diào)整
地圖任務(wù)編號(hào)
如果是在MapReduce中 maptask是通過(guò)==邏輯切片==機(jī)制決定的。但是在hive中,影響的因素很多。比如邏輯切片機(jī)制,文件是否壓縮、壓縮之后是否支持切割。因此在==Hive中,調(diào)整MapTask的個(gè)數(shù),直接去HDFS調(diào)整文件的大小和個(gè)數(shù),效率較高==。合并后的大小最好=塊大小。
如果有許多大文件,請(qǐng)調(diào)整blocl大小。
減少任務(wù)的數(shù)量
如果在MapReduce中,通過(guò)代碼可以直接指定 job.setNumReduceTasks(N)在Hive中,reducetask個(gè)數(shù)受以下幾個(gè)條件控制的hive . exec . reducers . bytes . per . reducer = 25600000
每個(gè)任務(wù)的最大縮減數(shù),默認(rèn)為1009
hive . exec . reducers . max = 1009
MapReduce . job . reductions[
-如果用戶沒(méi)有設(shè)置hive,用戶將根據(jù)數(shù)據(jù)量或sql需求評(píng)估reducetask的數(shù)量。
-用戶可以通過(guò)參數(shù)
-用戶設(shè)置可能不會(huì)生效。如果用戶設(shè)置與sql執(zhí)行邏輯沖突,如order by,hive將在sql編譯期間設(shè)置reducetask。[div][div]
編譯時(shí)確定的reduce任務(wù)數(shù):1
通用優(yōu)化-執(zhí)行計(jì)劃
從執(zhí)行計(jì)劃中可以看出==hive計(jì)劃接下來(lái)執(zhí)行這個(gè)SQL = =
格式:解釋+sql語(yǔ)句
通用優(yōu)化-并行機(jī)制、推測(cè)執(zhí)行機(jī)制
并行執(zhí)行機(jī)制
如果hivesql的底層某些stage階段可以并行執(zhí)行,就可以提高執(zhí)行效率。前提是==stage之間沒(méi)有依賴== 并行的弊端是瞬時(shí)服務(wù)器壓力變大。參數(shù)
set hive.exec.parallel=true; --是否并行執(zhí)行作業(yè)。適用于可以并行運(yùn)行的 MapReduce 作業(yè),例如在多次插入期間移動(dòng)文件以插入目標(biāo)set hive.exec.parallel.thread.number=16; --最多可以并行執(zhí)行多少個(gè)作業(yè)。默認(rèn)為8。Hive的嚴(yán)格模型
注意。不要和動(dòng)態(tài)分區(qū)的嚴(yán)格模式搞混淆。這里的嚴(yán)格模式指的是開(kāi)啟之后 ==hive會(huì)禁止一些用戶都影響不到的錯(cuò)誤包括效率低下的操作==,不允許運(yùn)行一些有風(fēng)險(xiǎn)的查詢。建立
set hive.mapred.mode = strict --默認(rèn)是嚴(yán)格模式 nonstrict解釋
1.如果是分區(qū)表,禁止在沒(méi)有where的情況下進(jìn)行分區(qū)裁剪。
2.order by語(yǔ)句必須受限于+limit
推測(cè)執(zhí)行機(jī)制= =建議關(guān)閉= =
MapReduce中task的一個(gè)機(jī)制。功能:在一個(gè)作業(yè)的底層,可能會(huì)有多個(gè)任務(wù)在執(zhí)行。如果某些延遲任務(wù)執(zhí)行緩慢,最終作業(yè)可能會(huì)失敗。
所謂= =推測(cè)執(zhí)行機(jī)制,就是通過(guò)算法找出滯后的任務(wù),并為其啟動(dòng)備份任務(wù)= =。
兩個(gè)任務(wù)同時(shí)處理一個(gè)數(shù)據(jù),誰(shuí)的結(jié)果就是最終結(jié)果。
推測(cè)執(zhí)行機(jī)制默認(rèn)是開(kāi)啟的,但是在企業(yè)生產(chǎn)環(huán)境中==建議關(guān)閉==。以上是Apache Hive通用調(diào)優(yōu)featch抓取機(jī)制的mr local模式的細(xì)節(jié)。關(guān)于Apache Hive一般調(diào)優(yōu)的更多信息,請(qǐng)關(guān)注腳本之家的其他相關(guān)文章!
如果您的問(wèn)題還未解決可以聯(lián)系站長(zhǎng)付費(fèi)協(xié)助。

有問(wèn)題可以加入技術(shù)QQ群一起交流學(xué)習(xí)
本站vip會(huì)員 請(qǐng)加入無(wú)憂模板網(wǎng) VIP群(50604020) PS:加入時(shí)備注用戶名或昵稱
普通注冊(cè)會(huì)員或訪客 請(qǐng)加入無(wú)憂模板網(wǎng) 技術(shù)交流群(50604130)
客服微信號(hào):15898888535
聲明:本站所有文章資源內(nèi)容,如無(wú)特殊說(shuō)明或標(biāo)注,均為采集網(wǎng)絡(luò)資源。如若內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系站長(zhǎng)刪除。