1.fetch抓取 hive.fetch.task.conversion=more 在某些情況下不必要使用mr計算。 hive預設是minimal,該屬性修改為more以後,在全域性查詢、字段查詢、limit查詢等都不走mapreduce。
2.本地模式
hive在進行集群作業時多台機器上協調執行,解決了大資料量查詢的問題。但當資料量比較小時,沒必要使用分布式查詢,可以使用本地模式來執行mr job,只在單台機器上執行效率高很多。
set hive.exec.mode.local.auto=true 是自動判斷是否開啟集群模式的開關,但是開啟這個引數並不能保證啟動本地模式,要當 map 任務數不超過
hive.exec.mode.local.auto.input.files.max 的個數並且 map 輸入檔案大小不超過hive.exec.mode.local.auto.inputbytes.max 所指定的大小時,才能啟動本地模式。
hive.exec.mode.local.auto.input.files.max=500000;設定local mr處理的最大資料量,當小於此值時,採用本地mr處理。
hive.exec.mode.local.auto.inputbytes.max=10;設定local mr的最大輸入檔案個數,當輸入檔案小於此值時,採用本地mr處理。
3.壓縮儲存
在進行hive建表時,盡量採用parquet,orc等列式儲存格式,因為列式儲存的表,列值在物理上是儲存在一起的,hive查詢時只需要遍歷列資料,從而大大減少了處理的資料量。
hive操作最終要轉為mapreducer計算,mr的瓶頸往往在於網路io和磁碟io,要解決效能問題,最主要是減少計算的資料量,而進行資料壓縮是乙個不錯的方式,hadoop自帶的gzip壓縮方式,
速度比較快,壓縮比也比較高。
job輸出檔案按照block以gzip方式進行壓縮:
set mapreduce.output.fileoutputformat.compress = true;//預設為false
set mapreduce.output.fileoutputformat.compress.type = record;//預設為record
set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.gzipcodec // 預設值是 org.apache.hadoop.io.compress.defaultcodec
對hive輸出結果和中間結果都進行壓縮:
set hive.exec.compress.output=true // 預設值是 false,不壓縮
set hive.exec.compress.intermediate=true // 預設值是 false,為 true 時 mr 設定的壓縮才啟用
4.表的優化
新版hive對大表join小表,小表join大表已經做了優化,執行效率沒有明顯的區別。
mapjoin 如果不指定mapjoin或者不符合mapjoin的條件,那麼hive解析器會將join操作轉換成common join,即在reduce階段完成join,容易發生資料傾斜。可以用mapjoin把小表全部載入到內存在map端進行join,避免reducer處理。
設定自動選擇mapjoin set hive.auto.convert.join = true; 預設為true
group by 預設情況下,map階段同一key分發給乙個reduce,當乙個key資料過大就傾斜了,並不是所有的聚合操作都在reducer端進行的,很多聚合可以先在map端進行部分聚合,最後在reduce端得出最終結果。
set hive.map.aggr = true 是否開啟在map端進行聚合。
set hive.groupby.mapaggr.checkinterval = 100000 設定在map端進行聚合操作的條數
set hive.groupby.skewindata = true 有資料傾斜的時候進行負載均衡。
行列過濾:
列處理:在select中,只拿需要的列,如果有,盡量使用分割槽過濾,少用select *。
行處理:在分割槽剪裁中,當使用外關聯時,如果將副表的過濾條件寫在where後面,那麼就會先全表關聯,之後再過濾。
還有很多,這裡不一一枚舉。
5.資料傾斜
(1)在map執行前進行小檔案合併,減少map數,combinehiveinputformat具有對小檔案進行合併的功能(系統預設的格式)。
set hive.merge.mapfiles = true ##在 map only 的任務結束時合併小檔案
set hive.merge.mapredfiles = false ## true 時在 mapreduce 的任務結束時合併小檔案
set hive.merge.size.per.task = 256*1000*1000 ##合併檔案的大小
set mapred.max.split.size=256000000; ##每個 map 最大分割大小
set mapred.min.split.size.per.node=1; ##乙個節點上 split 的最少值
set hive.input.format=org.apache.hadoop.hive.ql.io.combinehiveinputformat; ##執行map前進行小檔案合併
(2)複雜檔案處理時增加map數,從而提高任務的執行效率。
(3)reducer個數
hadoop mapreduce 程式中,reducer 個數的設定極大影響執行效率。
依據hadoop的經驗,可以將hive.exec.reducers.max設定為0.95*(集群中datanode的個數)。
reducer的個數並不是越多越好,過多的reducer啟動和初始化會消耗資源和時間,另外有多少個reducer就會有多少個小檔案,這些小檔案如果作為下乙個階段的輸入,也會產生小檔案過多的問題。因此,需要設定適當數量的reducer。
(4)並行執行
hive會將乙個查詢轉化成乙個或者多個階段。這樣的階段可以是mapreduce階段、抽樣階段、合併階段、limit階段。或者hive執行過程中可能需要的其他階段。預設情況下,hive一次只會執行乙個階段。不過,某個特定的job可能包含眾多的階段,而這些階段可能並非完全互相依賴的,也就是說有些階段是可以並行執行的,這樣可能使得整個job的執行時間縮短。不過,如果有更多的階段可以並行執行,那麼job可能就越快完成。通過設定hive.exec.parallel為true,就可以啟動併發執行了。
hive效能調優
原文 limit 限制調整 因為使用 limit 語句時候,是先執行整個查詢語句,然後再返回部分結果的 set hive.limit.optimize.enable true set hive.limit.row.max.size 10000 set hive.limit.optimize.limi...
Hive效能調優
軟體環境 hive1.2.1 hadoop2.6.4 直接使用hive cli模式執行 1.設定執行引擎 set hive.execution.engine mr set hive.execution.engine spark 如果設定執行引擎為mr,那麼就會呼叫hadoop的maprecude來執...
Hive實戰效能調優
hive是乙個資料倉儲基礎工具在hadoop中用來處理結構化資料。它架構在hadoop之上,總歸為大資料,並使得查詢和分析方便。並提供簡單的sql查詢功能,可以將sql語句轉換為mapreduce任務進行執行。hive 構建在基於靜態批處理的hadoop 之上,hadoop 通常都有較高的延遲並且在...