首頁 > 軟體

Apache Hive 通用調優featch抓取機制 mr本地模式

2022-09-02 18:04:35

Apache Hive-通用優化-featch抓取機制 mr本地模式

Fetch抓取機制

  • 功能:在執行sql的時候,能不走MapReduce程式處理就儘量不走MapReduce程式處理.
  • 儘量直接去運算元據檔案。

設定: 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程式除了可以提交到yarn叢集分散式執行之外,還可以使用本地模擬環境執行,當然此時就不是分散式執行的程式,但是針對小檔案小資料處理特別有效果。
  • 使用者可以通過設定hive.exec.mode.local.auto的值為true,來讓Hive在適當的時候自動啟動這個 優化。

功能:如果非要執行==MapReduce程式,能夠本地執行的,儘量不提交yarn上執行==。

預設是關閉的。意味著只要走MapReduce就提交yarn執行。

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

Hive提供了一個引數,自動切換MapReduce程式為本地模式,如果不滿足條件,就執行yarn模式。

set hive.exec.mode.local.auto = true;
--3個條件必須都滿足 自動切換本地模式
The total input size of the job is lower than: hive.exec.mode.local.auto.inputbytes.max (128MB by default)  --資料量小於128M
The total number of map-tasks is less than: hive.exec.mode.local.auto.tasks.max (4 by default)  --maptask個數少於4個
The total number of reduce tasks required is 1 or 0.  --reducetask個數是0 或者 1

切換Hive的執行引擎

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.

如果針對Hive的調優依然無法滿足你的需求 還是效率低, 嘗試使用spark計算引擎 或者Tez.

Apache Hive-通用優化-join優化

在瞭解join優化的時候,我們需要了解一個前置知識點:map端join 和reduce端join

- reduce端join

  • 這種join的弊端在於map階段沒有承擔太多的責任,所有的資料在經過shuffle在reduce階段實現的,而shuffle又是影響效能的核心點.

-map端join

  • 首先啟動本地任務將join中小表資料進行分散式快取
  • 啟動mr程式(只有map階段)並行處理巨量資料,並且從自己的快取中讀取小表資料,進行join,結果直接輸出到檔案中
  • 沒有shuffle過程 也沒有reduce過程
  • 弊端:快取太小導致表資料不能太大

reduce 端 join 優化

適合於大表Join大表

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

方式1:Bucktet Map Join 分桶表

語法: clustered by colName(參與join的欄位)
引數: set hive.optimize.bucketmapjoin = true
要求: 分桶欄位 = Join欄位 ,分桶的個數相等或者成倍數,必須是在map join中

方式2:Sort Merge Bucket Join(SMB)

基於有序的資料Join
語法:clustered by colName sorted by (colName)
引數
    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欄位 = 排序欄位,分桶的個數相等或者成倍數

map 端 join 優化

  • hive.auto.convert.join.noconditionaltask
hive.auto.convert.join=true
Hive老版本
#如果參與的一個表大小滿足條件 轉換為map join
hive.mapjoin.smalltable.filesize=25000000  
Hive2.0之後版本
#是否啟用基於輸入檔案的大小,將reduce join轉化為Map join的優化機制。假設參與join的表(或分割區)有N個,如果開啟這個引數,並且有N-1個表(或分割區)的大小總和小於hive.auto.convert.join.noconditionaltask.size引數指定的值,那麼會直接將join轉為Map join。
hive.auto.convert.join.noconditionaltask=true 
hive.auto.convert.join.noconditionaltask.size=512000000 

Apache Hive--通用調優--資料傾斜優化

資料傾斜優化
    什麼是資料傾斜
        描述的資料進行分散式處理  分配不平均的現象
    資料傾斜的後果
        某個task資料量過大 執行時間過長  導致整體job任務遲遲不結束
            執行時間長  出bug及風險機率提高
            霸佔運算資源 遲遲不釋放
    通常如何發現資料傾斜
        在yarn或者其他資源監控軟體上  發現某個job作業 卡在某個進度遲遲不動 (注意 倒不是報錯)
    造成資料傾斜的原因
        資料本身就傾斜
        自定義分割區、分組規則不合理
        業務影響 造成資料短期高頻波動
    資料傾斜的通用解決方案
        1、有錢  有預警  
            增加物理資源  單獨處理傾斜的資料
        2、沒錢  沒有預警
            傾斜資料打散  分步執行
                先將傾斜資料打散成多幹份 
                處理的結果再最終合併
    hive中資料傾斜的場景
        場景一:group by  、count(distinct)
            hive.map.aggr=true;  map端預聚合
            手動將資料隨機分割區  select * from table distribute by rand();
            如果有資料傾斜問題  開啟負載均衡
                先啟動第一個mr程式 把傾斜的資料隨機打散分散到各個reduce中
                然後第二個mr程式把上一步結果進行最終彙總
                hive.groupby.skewindata=true;
        場景二:join
            提前過濾,將巨量資料變成小資料,實現Map Join
            使用Bucket Join
            使用Skew Join
                將Map Join和Reduce Join進行合併,如果某個值出現了資料傾斜,就會將產生資料傾斜的資料單獨使用Map Join來實現
                最終將Map Join的結果和Reduce Join的結果進行Union合併
        Hive中通常指的是在reduce階段資料傾斜

解決方法

group by資料傾斜

方案一:開啟Map端聚合

hive.map.aggr=true;
#是否在Hive Group By 查詢中使用map端聚合。
#這個設定可以將頂層的部分聚合操作放在Map階段執行,從而減輕清洗階段資料傳輸和Reduce階段的執行時間,提升總體效能。但是指標不治本。

方案二:實現隨機分割區

實現隨機分割區
select * from table distribute by rand();

方案三:資料傾斜時==自動負載均衡==只使用group by

hive.groupby.skewindata=true;
#開啟該引數以後,當前程式會自動通過兩個MapReduce來執行
#第一個MapReduce自動進行隨機分佈到Reducer中,每個Reducer做部分聚合操作,輸出結果
#第二個MapReduce將上一步聚合的結果再按照業務(group by key)進行處理,保證相同的分佈到一起,最終聚合得到結果

join資料傾斜

  • 方案一:提前過濾,將巨量資料變成小資料,實現Map Join
  • 方案二:使用Bucket Join
  • 方案三:使用Skew Join

資料單獨使用Map Join來實現

#其他沒有產生資料傾斜的資料由Reduce Join來實現,這樣就避免了Reduce Join中產生資料傾斜的問題
#最終將Map Join的結果和Reduce Join的結果進行Union合併
#開啟執行過程中skewjoin
set hive.optimize.skewjoin=true;
#如果這個key的出現的次數超過這個範圍
set hive.skewjoin.key=100000;
#在編譯時判斷是否會產生資料傾斜
set hive.optimize.skewjoin.compiletime=true;
set hive.optimize.union.remove=true;
#如果Hive的底層走的是MapReduce,必須開啟這個屬性,才能實現不合並
set mapreduce.input.fileinputformat.input.dir.recursive=true;

Apache Hive--通用調優--MR程式task個數調整

maptask個數

  • 如果是在MapReduce中 maptask是通過==邏輯切片==機制決定的。
  • 但是在hive中,影響的因素很多。比如邏輯切片機制,檔案是否壓縮、壓縮之後是否支援切割。
  • 因此在==Hive中,調整MapTask的個數,直接去HDFS調整檔案的大小和個數,效率較高==。

合併的大小最好=block size

如果大檔案多,就調整blocl size

reducetask個數

  • 如果在MapReduce中,通過程式碼可以直接指定 job.setNumReduceTasks(N)
  • 在Hive中,reducetask個數受以下幾個條件控制的

hive.exec.reducers.bytes.per.reducer=256000000
每個任務最大的 reduce 數,預設為 1009
hive.exec.reducsers.max=1009
mapreduce.job.reduces
該值預設為-1,由 hive 自己根據任務情況進行判斷。

--如果使用者使用者不設定 hive將會根據資料量或者sql需求自己評估reducetask個數。
--使用者可以自己通過引數設定reducetask的個數
 set mapreduce.job.reduces = N
--使用者設定的不一定生效,如果使用者設定的和sql執行邏輯有衝突,比如order by,在sql編譯期間,hive又會將reducetask設定為合理的個數。  

Number of reduce tasks determined at compile time: 1

通用優化-執行計劃

通過執行計劃可以看出==hive接下來是如何打算執行這條sql的==。

語法格式:explain + sql語句

通用優化-並行機制,推測執行機制

並行執行機制

  • 如果hivesql的底層某些stage階段可以並行執行,就可以提高執行效率。
  • 前提是==stage之間沒有依賴== 並行的弊端是瞬時伺服器壓力變大。

引數

set hive.exec.parallel=true; --是否並行執行作業。適用於可以並行執行的 MapReduce 作業,例如在多次插入期間移動檔案以插入目標
set hive.exec.parallel.thread.number=16; --最多可以並行執行多少個作業。預設為8。

Hive的嚴格模式

  • 注意。不要和動態分割區的嚴格模式搞混淆。
  • 這裡的嚴格模式指的是開啟之後 ==hive會禁止一些使用者都影響不到的錯誤包括效率低下的操作==,不允許執行一些有風險的查詢。

設定

set hive.mapred.mode = strict --預設是嚴格模式  nonstrict

解釋

1、如果是分割區表,沒有where進行分割區裁剪 禁止執行

2、order by語句必須+limit限制

推測執行機制 ==建議關閉==。

  • MapReduce中task的一個機制。
  • 功能:

一個job底層可能有多個task執行,如果某些拖後腿的task執行慢,可能會導致最終job失敗。

所謂的==推測執行機制就是通過演演算法找出拖後腿的task,為其啟動備份的task==。

兩個task同時處理一份資料,誰先處理完,誰的結果作為最終結果。

  • 推測執行機制預設是開啟的,但是在企業生產環境中==建議關閉==。

以上就是Apache Hive 通用調優featch抓取機制 mr本地模式的詳細內容,更多關於Apache Hive 通用調優的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com