時間:2022-09-11來源:www.farandoo.com作者:電腦系統城
設置: hive.fetch.task.conversion= more。
1 2 3 4 5 6 7 |
--在下述3種情況下 sql不走mr程序 --全局查找 select * from student; --字段查找 select num, name from student; --limit 查找 select num, name from student limit 2; |
功能:如果非要執行==MapReduce程序,能夠本地執行的,盡量不提交yarn上執行==。
默認是關閉的。意味著只要走MapReduce就提交yarn執行。
1 2 |
mapreduce.framework.name = local 本地模式 mapreduce.framework.name = yarn 集群模式 |
Hive提供了一個參數,自動切換MapReduce程序為本地模式,如果不滿足條件,就執行yarn模式。
1 2 3 4 5 |
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 |
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.
在了解join優化的時候,我們需要了解一個前置知識點:map端join 和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字段 = 排序字段,分桶的個數相等或者成倍數
1 2 3 4 5 6 7 8 |
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 |
數據傾斜優化
什么是數據傾斜
描述的數據進行分布式處理 分配不平均的現象
數據傾斜的后果
某個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階段數據傾斜
解決方法
方案一:開啟Map端聚合
1 2 3 |
hive.map.aggr=true; #是否在Hive Group By 查詢中使用map端聚合。 #這個設置可以將頂層的部分聚合操作放在Map階段執行,從而減輕清洗階段數據傳輸和Reduce階段的執行時間,提升總體性能。但是指標不治本。 |
方案二:實現隨機分區
1 2 |
實現隨機分區 select * from table distribute by rand(); |
方案三:數據傾斜時==自動負載均衡==只使用group by
1 2 3 4 |
hive.groupby.skewindata= true ; #開啟該參數以后,當前程序會自動通過兩個MapReduce來運行 #第一個MapReduce自動進行隨機分布到Reducer中,每個Reducer做部分聚合操作,輸出結果 #第二個MapReduce將上一步聚合的結果再按照業務(group by key)進行處理,保證相同的分布到一起,最終聚合得到結果 |
數據單獨使用Map Join來實現
1 2 3 4 5 6 7 8 9 10 11 |
#其他沒有產生數據傾斜的數據由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 ; |
合并的大小最好=block size
如果大文件多,就調整blocl size
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語句
并行執行機制
參數
1 2 |
set hive. exec .parallel= true ; --是否并行執行作業。適用于可以并行運行的 MapReduce 作業,例如在多次插入期間移動文件以插入目標 set hive. exec .parallel.thread.number=16; --最多可以并行執行多少個作業。默認為8。 |
設置
1 | set hive.mapred.mode = strict --默認是嚴格模式 nonstrict |
解釋
1、如果是分區表,沒有where進行分區裁剪 禁止執行
2、order by語句必須+limit限制
推測執行機制 ==建議關閉==。
一個job底層可能有多個task執行,如果某些拖后腿的task執行慢,可能會導致最終job失敗。
所謂的==推測執行機制就是通過算法找出拖后腿的task,為其啟動備份的task==。
兩個task同時處理一份數據,誰先處理完,誰的結果作為最終結果。
2022-09-11
系統之家推薦Windows Server 2019 DNS服務器配置方法教程圖解大全(入門篇)2022-09-11
腳本之家推薦Windows Server 2019 WEB和FTP服務器安裝配置方法大全圖解教程2022-09-11
系統城分享keepalived對nginx進行高可用搭建及原理詳解一、服務器入侵現象 二、服務器排查和處理 2.1、服務器被入侵的可能原因 2.2、排查和處理步驟 三、本次入侵需要帶來啟示的點 四、本次服務器被入侵的一些啟示...
2022-09-11
1 環境搭建 依賴庫安裝 源碼下載與編譯 編譯過程 2 推流服務 2.1 利用文件推流 2.2 將一路流灌到nginx服務器rtmp進行推流 3 直播拉流 ...
2022-07-18