1. 程式人生 > >HIVE的十項企業級調優。。。。。。

HIVE的十項企業級調優。。。。。。

話不多說直接上貨。。。。。。。。。。。。。。。。。。。。。。。。。。。

1.Fetch抓取

 set hive.fetch.task.conversion=more(預設)

Fetch 抓取是指,Hive 中對某些情況的查詢可以不必使用 MapReduce 計算。
該屬性設定為 more 以後,在全域性查詢、欄位查詢、limit 查詢等都不走 MapReduce。 設定為none後所有型別的查詢語句都要走MapReduce;

2.本地模式

set hive.exec.mode.local.auto=true(開啟本地模式)

Hive 可以通過本地模式在單臺機器上 處理所有的任務。對於小資料集,執行時間可以明顯被縮短

①開啟本地模式後需要設定local mr的最大輸入資料量,當資料量小於這個值時採用local mr的方式

set hive.exec.mode.local.auto.inputbytes.max=134217728(預設)

②開啟本地模式後需要設定local mr的最大輸入檔案個數,當資料量小於這個值時採用local mr的方式

set hive.exec.mode.local.auto.input.files.max=4(預設)

3.表的優化

3.1小表join大表 (小表需要在左邊.)

注:(新版的 hive 已經對小表 JOIN 大表和大表 JOIN 小表進行了優化。小表 放在左邊和右邊已經沒有明顯區別。)

3.2大表join大表

當一個表內有許多空值時會導致MapReduce過程中,空成為一個key值,對應的會有大量的value值, 而一個key的value會一起到達reduce造成記憶體不足;所以要想辦法過濾這些空值.

(1).通過查詢所有不為空的結果

   insert overwrite table jointable select n.* from 
   (select * from nullidtable where id is not null ) n left join ori o on n.id = o.id;

(2).查詢出空值並給其賦上隨機數,避免了key值為空

insert overwrite table jointable
select n.* from nullidtable n full join ori o on 
case when n.id is null then concat('hive', rand()) else n.id end = o.id;

注:此方法可以解決資料傾斜的問題

3.3MapJoin

如果不指定 MapJoin 或者不符合 MapJoin 的條件,那麼 Hive 解析器會將 Join 操作轉換成 Common Join,即:在 Reduce 階段完成 join。容易發生資料傾斜。可以用 MapJoin 把小 表全部載入到記憶體在 map 端進行 join,避免 reducer 處理。

設定MapJoin

set hive.auto.convert.join = true(預設)

大表小表的閥門值設定(預設25M以下認為是小表):

 set hive.mapjoin.smalltable.filesize=25000000;
3.4Group BY

預設情況下,Map 階段同一 Key 資料分發給一個 reduce,當一個 key 資料過大時就傾斜了並不是所有聚合都在reduce端完成,很多聚合操作都可以現在Map端進行部分聚合,最後在Reduce段得到結果

開啟Map端聚合引數設定

  1. 是否在Map段進行聚合,預設為true
hive.map.aggr = true
  1. 在Map端進行聚合操作的條目數
 hive.groupby.mapaggr.checkinterval = 100000
  1. 有資料傾斜的時候進行負載均衡(預設是false)
hive.groupby.skewindata = true

注:當選項設定為 true,生成的查詢計劃會有兩個 MR Job。第一個 MR Job 中,Map 的輸出結果會隨機分佈到 Reduce 中,每個 Reduce 做部分聚合操作,並輸出結果,這樣處理的結果是相同的 Group By Key 有可能被分發到不同的 Reduce 中,從而達到負載均衡的目的;第二個 MR Job 再根據預處理的資料結果按照 Group By Key 分佈到 Reduce 中(這個過程可以 保證相同的 Group By Key 被分佈到同一個 Reduce 中),最後完成最終的聚合操作。

3.5Count(Distinct)去重統計

Count Distinct是使用了一個mapreduce ,當資料較少時無影響當資料較大時 只使用一個MapReduce將很難完成job。這是需要用到分組 Group BY 會使用2個MapReduce完成因為設定了 set mapreduce.job.reduces = 5; 所以第一個MapReduce的過程是通過一個map和5個reduce來完成這樣減輕了reduce的負載, 雖然會多用一個 Job 來完成,但在資料量大的情況下,這個絕對是值得的。

3.6.行列過濾
  • 列處理: 在select中,只拿需要的列,儘量使用分割槽過濾,少用select*
  • 行處理: 在分割槽剪裁中,當使用外關聯時,如果將副表的過濾條件寫在where後面那麼就會先全表關聯,之後再過濾。
例項:

(1)測試先關聯兩張表,再用 where 條件過濾

hive (default)> select o.id from bigtable bjoin ori o on o.id = b.idwhere o.id <= 10;

(2)通過子查詢後,再關聯表

hive (default)> select b.id from bigtable b	join (select id from ori where id <= 10 ) o on b.id = o.id;
3.7.動態分割槽

關係型資料庫中,對分割槽表 Insert 資料時候,資料庫自動會根據分割槽欄位的值,將資料插入到相應的分割槽中,Hive 中也提供了類似的機制,即動態分割槽(Dynamic Partition),只不過,使用 Hive 的動態分割槽,需要進行相應的配置。
首先要設定的屬性

set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
set hive.exec.max.dynamic.partitions = 1000;
set hive.exec.max.dynamic.partitions.pernode = 100;
set hive.exec.max.created.files = 100000;
set hive.error.on.empty.partition = false;

模擬動態分割槽

 insert overwrite table ori_partitioned_target partition (p_time)
select id, time, uid, keyword, url_rank, click_num, click_url, p_time from ori_partitioned;

4.資料傾斜

4.1合理設定Map數

設定切片值: set mapreduce.input.fileinputformat.split.maxsize=

4.2小檔案進行合併

在 map 執行前合併小檔案,減少 map 數:CombineHiveInputFormat 具有對小檔案進行
合併的功能(系統預設的格式)。HiveInputFormat 沒有對小檔案合併功能。

set hive.input.format= org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;
4.3複雜檔案增加Map數
 set mapreduce.job.maps 
4.4合理設定Reduce數

①調整reduce的個數方法一
(1)每個Reduce處理的資料預設是256MB

hive.exec.reducers.bytes.per.reducer=256000000

(2)每個任務最大的reduce數,預設為1009

 hive.exec.reducers.max=1009

(3)計算reduce數的公式
N=min(引數2,總輸入資料量/引數1)

②調整reduce個數的方法二

set mapreduce.job.reduces=

③reduce個數不是越多越好
1)過多的啟動和初始化 reduce 也會消耗時間和資源;
2)另外,有多少個 reduce,就會有多少個輸出檔案,如果生成了很多個小檔案,那麼如果這些小檔案作為下一個任務的輸入,則也會出現小檔案過多的問題;在設定 reduce 個數的時候也需要考慮這兩個原則:處理大資料量利用合適的 reduce 數;使單個 reduce 任務處理資料量大小要合適;

4.5並行執行

通過設定引數 hive.exec.parallel 值為 true,就可以開啟併發執行。不過,在共享叢集中,需要注意下,如果 job 中並行階段增多,那麼叢集利用率就會增加。
①set hive.exec.parallel=true; //開啟任務並行執行
①set hive.exec.parallel.thread.number=16; //同一個 sql 允許最大並行度,預設為 8。

4.6嚴格模式

沒寫完下次繼續更。。。。。。。。。。。。。。。。。