欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Apache Hive 通用調(diào)優(yōu)featch抓取機(jī)制 mr本地模式

 更新時(shí)間:2022年08月31日 15:25:23   作者:Eqo  
這篇文章主要為大家介紹了Apache Hive 通用調(diào)優(yōu)featch抓取機(jī)制 mr本地模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Apache Hive-通用優(yōu)化-featch抓取機(jī)制 mr本地模式

Fetch抓取機(jī)制

  • 功能:在執(zhí)行sql的時(shí)候,能不走M(jìn)apReduce程序處理就盡量不走M(jìn)apReduce程序處理.
  • 盡量直接去操作數(shù)據(jù)文件。

設(shè)置: 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)閉的。意味著只要走M(jìn)apReduce就提交yarn執(zhí)行。

mapreduce.framework.name = local 本地模式
mapreduce.framework.name = yarn 集群模式 

Hive提供了一個(gè)參數(shù),自動(dòng)切換MapReduce程序?yàn)楸镜啬J剑绻粷M足條件,就執(zhí)行yarn模式。

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ù)量小于128M
The 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

切換Hive的執(zhí)行引擎

WARNING: Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.

如果針對(duì)Hive的調(diào)優(yōu)依然無(wú)法滿足你的需求 還是效率低, 嘗試使用spark計(jì)算引擎 或者Tez.

Apache Hive-通用優(yōu)化-join優(yōu)化

在了解join優(yōu)化的時(shí)候,我們需要了解一個(gè)前置知識(shí)點(diǎn):map端join 和reduce端join

- reduce端join

  • 這種join的弊端在于map階段沒(méi)有承擔(dān)太多的責(zé)任,所有的數(shù)據(jù)在經(jīng)過(guò)shuffle在reduce階段實(shí)現(xiàn)的,而shuffle又是影響性能的核心點(diǎn).

-map端join

  • 首先啟動(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ù)不能太大

reduce 端 join 優(yōu)化

適合于大表Join大表

bucket join-- 適合于大表Join大表

方式1:Bucktet Map Join 分桶表

語(yǔ)法: clustered by colName(參與join的字段)
參數(shù): set hive.optimize.bucketmapjoin = true
要求: 分桶字段 = Join字段 ,分桶的個(gè)數(shù)相等或者成倍數(shù),必須是在map join中

方式2:Sort Merge Bucket Join(SMB)

基于有序的數(shù)據(jù)Join
語(yǔ)法:clustered by colName sorted by (colName)
參數(shù)
    set hive.optimize.bucketmapjoin = true;
    set hive.auto.convert.sortmerge.join=true;
    set hive.optimize.bucketmapjoin.sortedmerge = true;
    set hive.auto.convert.sortmerge.join.noconditionaltask=true;
要求: 分桶字段 = Join字段 = 排序字段,分桶的個(gè)數(shù)相等或者成倍數(shù)

map 端 join 優(yōu)化

  • hive.auto.convert.join.noconditionaltask
hive.auto.convert.join=true
Hive老版本
#如果參與的一個(gè)表大小滿足條件 轉(zhuǎn)換為map join
hive.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=512000000 

Apache Hive--通用調(diào)優(yōu)--數(shù)據(jù)傾斜優(yōu)化

數(shù)據(jù)傾斜優(yōu)化
    什么是數(shù)據(jù)傾斜
        描述的數(shù)據(jù)進(jìn)行分布式處理  分配不平均的現(xiàn)象
    數(shù)據(jù)傾斜的后果
        某個(gè)task數(shù)據(jù)量過(guò)大 執(zhí)行時(shí)間過(guò)長(zhǎng)  導(dǎo)致整體job任務(wù)遲遲不結(jié)束
            執(zhí)行時(shí)間長(zhǎng)  出bug及風(fēng)險(xiǎn)幾率提高
            霸占運(yùn)算資源 遲遲不釋放
    通常如何發(fā)現(xiàn)數(shù)據(jù)傾斜
        在yarn或者其他資源監(jiān)控軟件上  發(fā)現(xiàn)某個(gè)job作業(yè) 卡在某個(gè)進(jìn)度遲遲不動(dòng) (注意 倒不是報(bào)錯(cuò))
    造成數(shù)據(jù)傾斜的原因
        數(shù)據(jù)本身就傾斜
        自定義分區(qū)、分組規(guī)則不合理
        業(yè)務(wù)影響 造成數(shù)據(jù)短期高頻波動(dòng)
    數(shù)據(jù)傾斜的通用解決方案
        1、有錢  有預(yù)警  
            增加物理資源  單獨(dú)處理傾斜的數(shù)據(jù)
        2、沒(méi)錢  沒(méi)有預(yù)警
            傾斜數(shù)據(jù)打散  分步執(zhí)行
                先將傾斜數(shù)據(jù)打散成多干份 
                處理的結(jié)果再最終合并
    hive中數(shù)據(jù)傾斜的場(chǎng)景
        場(chǎng)景一:group by  、count(distinct)
            hive.map.aggr=true;  map端預(yù)聚合
            手動(dòng)將數(shù)據(jù)隨機(jī)分區(qū)  select * from table distribute by rand();
            如果有數(shù)據(jù)傾斜問(wèn)題  開(kāi)啟負(fù)載均衡
                先啟動(dòng)第一個(gè)mr程序 把傾斜的數(shù)據(jù)隨機(jī)打散分散到各個(gè)reduce中
                然后第二個(gè)mr程序把上一步結(jié)果進(jìn)行最終匯總
                hive.groupby.skewindata=true;
        場(chǎng)景二:join
            提前過(guò)濾,將大數(shù)據(jù)變成小數(shù)據(jù),實(shí)現(xiàn)Map Join
            使用Bucket Join
            使用Skew Join
                將Map Join和Reduce Join進(jìn)行合并,如果某個(gè)值出現(xiàn)了數(shù)據(jù)傾斜,就會(huì)將產(chǎn)生數(shù)據(jù)傾斜的數(shù)據(jù)單獨(dú)使用Map Join來(lái)實(shí)現(xiàn)
                最終將Map Join的結(jié)果和Reduce Join的結(jié)果進(jìn)行Union合并
        Hive中通常指的是在reduce階段數(shù)據(jù)傾斜

解決方法

group by數(shù)據(jù)傾斜

方案一:開(kāi)啟Map端聚合

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é)果

join數(shù)據(jù)傾斜

  • 方案一:提前過(guò)濾,將大數(shù)據(jù)變成小數(shù)據(jù),實(shí)現(xiàn)Map Join
  • 方案二:使用Bucket Join
  • 方案三:使用Skew Join

數(shù)據(jù)單獨(dú)使用Map Join來(lái)實(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ò)程中skewjoin
set 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)整

maptask個(gè)數(shù)

  • 如果是在MapReduce中 maptask是通過(guò)==邏輯切片==機(jī)制決定的。
  • 但是在hive中,影響的因素很多。比如邏輯切片機(jī)制,文件是否壓縮、壓縮之后是否支持切割。
  • 因此在==Hive中,調(diào)整MapTask的個(gè)數(shù),直接去HDFS調(diào)整文件的大小和個(gè)數(shù),效率較高==。

合并的大小最好=block size

如果大文件多,就調(diào)整blocl size

reducetask個(gè)數(shù)

  • 如果在MapReduce中,通過(guò)代碼可以直接指定 job.setNumReduceTasks(N)
  • 在Hive中,reducetask個(gè)數(shù)受以下幾個(gè)條件控制的

hive.exec.reducers.bytes.per.reducer=256000000
每個(gè)任務(wù)最大的 reduce 數(shù),默認(rèn)為 1009
hive.exec.reducsers.max=1009
mapreduce.job.reduces
該值默認(rèn)為-1,由 hive 自己根據(jù)任務(wù)情況進(jìn)行判斷。

--如果用戶用戶不設(shè)置 hive將會(huì)根據(jù)數(shù)據(jù)量或者sql需求自己評(píng)估reducetask個(gè)數(shù)。
--用戶可以自己通過(guò)參數(shù)設(shè)置reducetask的個(gè)數(shù)
 set mapreduce.job.reduces = N
--用戶設(shè)置的不一定生效,如果用戶設(shè)置的和sql執(zhí)行邏輯有沖突,比如order by,在sql編譯期間,hive又會(huì)將reducetask設(shè)置為合理的個(gè)數(shù)。  

Number of reduce tasks determined at compile time: 1

通用優(yōu)化-執(zhí)行計(jì)劃

通過(guò)執(zhí)行計(jì)劃可以看出==hive接下來(lái)是如何打算執(zhí)行這條sql的==。

語(yǔ)法格式:explain + 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)的查詢。

設(shè)置

set hive.mapred.mode = strict --默認(rèn)是嚴(yán)格模式  nonstrict

解釋

1、如果是分區(qū)表,沒(méi)有where進(jìn)行分區(qū)裁剪 禁止執(zhí)行

2、order by語(yǔ)句必須+limit限制

推測(cè)執(zhí)行機(jī)制 ==建議關(guān)閉==。

  • MapReduce中task的一個(gè)機(jī)制。
  • 功能:

一個(gè)job底層可能有多個(gè)task執(zhí)行,如果某些拖后腿的task執(zhí)行慢,可能會(huì)導(dǎo)致最終job失敗。

所謂的==推測(cè)執(zhí)行機(jī)制就是通過(guò)算法找出拖后腿的task,為其啟動(dòng)備份的task==。

兩個(gè)task同時(shí)處理一份數(shù)據(jù),誰(shuí)先處理完,誰(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本地模式的詳細(xì)內(nèi)容,更多關(guān)于Apache Hive 通用調(diào)優(yōu)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論