12個Hive優化點彙總

Hive優化

​ Hive的存儲層依託於HDFS,Hive的計算層依託於MapReduce,一般Hive的執行效率主要取決於SQL語句的執行效率,因此,Hive的優化的核心思想是MapReduce的優化。

1、查看Hive執行計劃(小白慎用)

​ Hive的SQL語句在執行之前需要將SQL語句轉換成MapReduce任務,因此需要了解具體的轉換過程,可以在SQL語句中輸入如下命令查看具體的執行計劃。

--查看執行計劃,添加extended關鍵字可以查看更加詳細的執行計劃
explain [extended] query

2、Hive的抓取策略

​ Hive的某些SQL語句需要轉換成MapReduce的操作,某些SQL語句就不需要轉換成MapReduce操作,但是同學們需要注意,理論上來說,所有的SQL語句都需要轉換成MapReduce操作,只不過Hive在轉換SQL語句的過程中會做部分優化,使某些簡單的操作不再需要轉換成MapReduce,例如:

​ (1)select 僅支持本表字段

​ (2)where僅對本表字段做條件過濾

--查看Hive的數據抓取策略
Set hive.fetch.task.conversion=none/more;
默認more
執行select * from tableA;---無MR

修改爲none,select * from tableA;---有MR

3、Hive本地模式

​ 類似於MapReduce的操作,Hive的運行也分爲本地模式和集羣模式,在開發階段可以選擇使用本地執行,提高SQL語句的執行效率,驗證SQL語句是否正確。

--設置本地模式
set hive.exec.mode.local.auto=true;

select count(*) from psn;
查詢錶速度會很快

注意:要想使用Hive的本地模式,加載數據文件大小不能超過128M,如果超過128M,就算設置了本地模式,也會按照集羣模式運行。

--設置讀取數據量的大小限制
set hive.exec.mode.local.auto.inputbytes.max=128M

4、Hive並行模式

​ 在SQL語句足夠複雜的情況下,可能在一個SQL語句中包含多個子查詢語句,且多個子查詢語句之間沒有任何依賴關係,此時,可以Hive運行的並行度

--設置Hive SQL的並行度
set hive.exec.parallel=true;

​ 注意:Hive的並行度並不是無限增加的(因爲佔用資源),在一次SQL計算中,可以通過以下參數來設置並行的job的個數

--設置一次SQL計算允許並行執行的job個數的最大值,默認值爲8
set hive.exec.parallel.thread.number

5、Hive嚴格模式

​ Hive中爲了提高SQL語句的執行效率,可以設置嚴格模式,充分利用Hive的某些特點。

-- 設置Hive的嚴格模式
set hive.mapred.mode=strict;

set hive.exec.dynamic.partition.mode=nostrict;

​ 注意:當設置嚴格模式之後,會有如下限制:

​ (1)對於分區表,必須添加where對於分區字段的條件過濾

​ (2)order by語句必須包含limit輸出限制

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6npf9jhF-1592920751590)(D:\Study\winter\大數據\BigDataArchitect-master\bigdata_hive\notes\12 Hive優化.assets\1592914574964.png)]

​ (3)限制執行笛卡爾積的查詢

注意

在hive的動態分區模式下,如果爲嚴格模式,則必須需要一個分區列式靜態分區

6、Hive排序

​ 在編寫SQL語句的過程中,很多情況下需要對數據進行排序操作,Hive中支持多種排序操作適合不同的應用場景。

​ 1、Order By - 對於查詢結果做全排序,只允許有一個reduce處理-----基本不用
​ (當數據量較大時,應慎用。嚴格模式下,必須結合limit來使用)
​ 2、Sort By - 對於單個reduce的數據進行排序
​ 3、Distribute By - 分區排序,經常和Sort By結合使用
​ 4、Cluster By - 相當於 Sort By + Distribute By-----默認升序才它
​ (Cluster By不能通過asc、desc的方式指定排序規則;
​ 可通過 distribute by column sort by column asc|desc 的方式)

7、Hive join

​ 1、Hive 在多個表的join操作時儘可能多的使用相同的連接鍵,這樣在轉換MR任務時會轉換成少的MR的任務。

​ 2、手動Map join:在map端完成join操作

--SQL方式,在SQL語句中添加MapJoin標記(mapjoin hint)
--將小表放到內存中,省去shffle操作
SELECT  /*+ MAPJOIN(smallTable) */  smallTable.key,  bigTable.value 
FROM  smallTable  JOIN  bigTable  ON  smallTable.key  =  bigTable.key;

​ 3、開啓自動的Map Join

--通過修改以下配置啓用自動的mapjoin:
set hive.auto.convert.join = true;
--(該參數爲true時,Hive自動對左邊的表統計量,如果是小表就加入內存,即對小表使用Map join,所以小表寫在左邊)
--相關配置參數:
hive.mapjoin.smalltable.filesize;  
--(大表小表判斷的閾值,如果表的大小小於該值則會被加載到內存中運行)

hive.ignore.mapjoin.hint;
--(默認值:true;是否忽略mapjoin hint 即mapjoin標記)
--例如:如果自動的Map join開啓後(hive.auto.convert.join=true),依舊用了手動的Mapjoin hint進行標記怎麼辦?就看這個hive.ignore.mapjoin.hint的值,如果爲true,則忽視hint標記,依據自動的配置來進行mapjoin的操作;如果爲false,則依據手動設置的標記進行mapjoin

其中,hive.mapjoin.smalltable.filesize默認約爲25M(比25M小點),因爲要往內存中放,所以調整此參數不要太大

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3pMjo0pC-1592920751592)(D:\Study\winter\大數據\BigDataArchitect-master\bigdata_hive\notes\12 Hive優化.assets\1592916918079.png)]

​ 4、大表join大表(執行效率特別低)

​ (1)空key過濾:有時join超時是因爲某些key對應的數據太多,而相同key對應的數據都會發送到相同的reducer上,從而導致內存不夠。此時我們應該仔細分析這些異常的key,很多情況下,這些key對應的數據是異常數據,我們需要在SQL語句中進行過濾。
​ (2)空key轉換:有時雖然某個key爲空對應的數據很多,但是相應的數據不是異常數據,必須要包含在join的結果中,此時我們可以表a中key爲空的字段賦一個隨機的值,使得數據隨機均勻地分不到不同的reducer上

8、Map-Side聚合

​ Hive的某些SQL操作可以實現map端的聚合,類似於MR的combine操作

但是,combine操作不一定必須,有可能執行完聚合後效果不高反而佔用資源(combine也是一種reduce程序)

那麼怎麼設置才能合理的讓Map-side的聚合發生呢?

--通過設置以下參數開啓在Map端的聚合:
set hive.map.aggr=true;
--相關配置參數:
--map端group by執行聚合時處理的多少行數據(默認:100000)
hive.groupby.mapaggr.checkinterval: 

--聚合後/基數10w=聚合比例
--進行聚合的最小比例(預先對100000條數據做聚合,若聚合之後的數據量/100000的值大於該配置0.5,則不會聚合) 
hive.map.aggr.hash.min.reduction: 

--map端聚合使用的內存的最大值
hive.map.aggr.hash.percentmemory: 

--是否對GroupBy產生的數據傾斜做優化,默認爲false
--此參數特別重要,當選項設定爲 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果集合會隨機分佈到Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的數據結果按照 Group ByKey 分佈到 Reduce 中(這個過程可以保證相同的 Group By Key 被分佈到同一個 Reduce中),最後完成最終的聚合操作。
--注意:只能對單個字段聚合。控制生成兩個MR Job,第一個MR Job Map的輸出結果隨機分配到reduce中減少某些key值條數過多某些key條數過小造成的數據傾斜問題。
--這個變量是用於控制負載均衡的。當數據出現傾斜時,如果該變量設置爲true,那麼Hive會自動進行負載均衡。在多個列上進行的去重操作與hive環境變量hive.groupby.skewindata存在關係。
--當hive.groupby.skewindata=true時,hive不支持多列上的去重操作,會報錯
hive.groupby.skewindata


9、合併小文件

​ Hive在操作的時候,如果文件數目小,容易在文件存儲端造成壓力,給hdfs造成壓力,影響效率

--設置合併屬性
--是否合併map輸出文件:
set hive.merge.mapfiles=true
--是否合併reduce輸出文件:
set hive.merge.mapredfiles=true;
--合併文件的大小:
set hive.merge.size.per.task=256*1000*1000

10、去重統計

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Gx3OYtdf-1592920751593)(D:\Study\winter\大數據\BigDataArchitect-master\bigdata_hive\notes\12 Hive優化.assets\1592919388586.png)]

11、合理設置Map以及Reduce的數量

--Map數量相關的參數
--一個split的最大值,即每個map處理文件的最大值
set mapred.max.split.size
--一個節點上split的最小值
set mapred.min.split.size.per.node
--一個機架上split的最小值
set mapred.min.split.size.per.rack
--Reduce數量相關的參數
--強制指定reduce任務的數量
set mapred.reduce.tasks
--每個reduce任務處理的數據量
set hive.exec.reducers.bytes.per.reducer
--每個任務最大的reduce數
set hive.exec.reducers.max

12、JVM重用

JPS中的yarnchild進程是啥?提起這個,拓展下hadoop集羣中主要的進程
hadoop集羣中主要進程
master: NameNode, ResourceManager,
slaves: DataNode, NodeManager, RunJar, MRAppMaster,YarnChild

其中 RunJar, MRAppMaster,YarnChild與隨着某個job的創建而創建,隨着job的完成而終止。它們的作用分別是:
RunJar:完成job的初始化,包括獲取jobID,將jar包上傳至hdfs等。
MRAppMaster:每個job一個進程,主要跟蹤job的運行情況,向RM申請資源等。
YarnChild:運行具體的map/reduce task。

job啓動過程:
ResourceManage,NodeManager->RunJar->MRAppMaster->YarnChild

job退出過程:
YarnChild->MRAppMaster->RunJar
即所有的map/reduce均完成後,MRAppMaster才退出,最後RunJar退出,job完成

/*
適用場景:
	1、小文件個數過多
	2、task個數過多
缺點:
	設置開啓之後,task插槽會一直佔用資源,不論是否有task運行,直到所有的task即整個job全部執行完成時,纔會釋放所有的task插槽資源!
*/
set mapred.job.reuse.jvm.num.tasks=n;--(n爲task插槽個數)

--有點類似於數據庫連接池的概念
--申請多了,放着不動,佔着茅坑xxx
--申請的少了,再去拉取



所以yarn界面中的這兩個參數在一直變化

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章