hive優化要點總結

2021-06-18 12:30:24 字數 2609 閱讀 1333

個人認為總體兩種思想

1、讓伺服器盡可能的多做事情,榨乾伺服器資源,以最高系統吞吐量為目標

再好的硬體沒有充分利用起來,都是白扯淡。

比如:(1)啟動一次job盡可能的多做事情,乙個job能完成的事情,不要兩個job來做

通常來說前面的任務啟動可以稍帶一起做的事情就一起做了,以便後續的多個任務重用,與此緊密相連的是模型設計,好的模型特別重要.

(2)合理設定reduce個數

reduce個數過少沒有真正發揮hadoop平行計算的威力,但reduce個數過多,會造成大量小檔案問題,資料量、資源情況只有自己最清楚,找到個折衷點,

(3)使用hive.exec.parallel引數控制在同乙個sql

中的不同的

job是否可以同時執行,提高作業的併發

2、讓伺服器盡量少做事情,走最優的路徑,以資源消耗最少為目標

比如:(1) 注意join的使用

若其中有乙個表很小使用map join,否則使用普通的reduce join,注意hive會將join前面的表資料裝載記憶體,所以較小的乙個表在較大的表之前,減少記憶體資源的消耗

(2)注意小檔案的問題

在hive裡有兩種比較常見的處理辦法

第一是使用combinefileinputformat,將多個小檔案打包作為乙個整體的inputsplit,減少map任務數

set mapred.max.split.size=256000000;

set mapred.min.split.size.per.node=256000000

set  mapred.min.split.size.per.rack=256000000

set hive.input.format=org.apache.hadoop.hive.ql.io.combinehiveinputformat

第二是設定hive引數,將額外啟動乙個mr job打包小檔案

hive.merge.mapredfiles = false 是否合併 reduce 

輸出檔案,預設為 

false 

hive.merge.size.per.task = 256*1000*1000 合併檔案的大小 

(3)注意資料傾斜

在hive裡比較常用的處理辦法

第一通過hive.groupby.skewindata=true控制生成兩個mr job,第乙個mr job map的輸出結果隨機分配到reduce做次預彙總,減少某些key值條數過多某些key條數過小造成的資料傾斜問題

第二通過hive.map.aggr = true(預設為true)在map端做combiner,假如map各條資料基本上不一樣, 聚合沒什麼意義,做combiner反而畫蛇添足,hive裡也考慮的比較周到通過引數hive.groupby.mapaggr.checkinterval = 100000 (預設)hive.map.aggr.hash.min.reduction=0.5(預設),預先取100000條資料聚合,如果聚合後的條數/100000>0.5,則不再聚合

第三對實際key資料分布預先統計根據實際情況進行調優。

-舉例:

null值較多,分布在乙個reduce調優

select*

fromlog a

left outer join bmw_users b

on case when a.user_id is null thenconcat(『dp_hive』,rand() ) else a.user_id end = b.user_id;

再比如做reduce join時關聯某些值特別多,我們可以先count取樣下,知道有哪幾個值特別斜,用union all

這些值的單獨用mapjoin,再 union 起來

(4)善用multi insert,union all

multi insert適合基於同乙個源表按照不同邏輯不同粒度處理插入不同表的場景,做到只需要掃瞄源表一次,job個數不變,減少源表掃瞄次數

union all用好,可減少表的掃瞄次數,減少job的個數,通常預先按不同邏輯不同條件生成的查詢union all後,再統一group by計算,不同表的union all相當於multiple inputs,同乙個表的union all,相當map一次輸出多條

(5) 引數設定的調優

集群引數種類繁多,舉個例子比如

可針對特定job

設定特定引數,比如

jvm重用

,reduce copy

執行緒數量設定(適合

map較快,輸出量較大

)如果任務數多且小,比如在一分鐘之內完成,減少task

數量以減少任務初始化的消耗。可以通過配置

jvm重用選項減少

task

的消耗

Hive 優化總結

1.left semi join let semi join 只是hive的一種join。left semi join是可以高效實現in exists子查詢的語義。hive本身是不支援exist和in語句的,以下sql語義 1 select a.key,a.value from a where a....

Hive程式設計指南 要點總結(1)

1.當對3個或更多的表進行join連線時,若是on子句都是使用相同的連線鍵的話,那麼只會產生乙個mapreduce任務。2.使用者在進行多表查詢時,需要保證連續查詢的表的大小從左至右是依次增大的。因為hive假定查詢中最後乙個表是最大的表,在對每行記錄進行連線操作時,它會嘗試將其他表快取起來,然後掃...

hive查詢優化總結

hive查詢優化總結 儲存,學習,分享 join查詢操作的基本原則 應該將條目少的表 子查詢放在 join 操作符的左邊。原因是在 join 操作的 reduce 階段,位於 join 操作符左邊的表的內容會被載入進記憶體,將條目少的表放在左邊,可以有效減少發生記憶體溢位錯誤的機率。join查詢操作...