01 hive優化總結經驗

2021-07-24 05:35:13 字數 3836 閱讀 1674

hive優化總結 .

hive是將符合sql語法的字串解析生成可以在hadoop上執行的mapreduce的工具。使用hive盡量按照分布式計算的一些特點來設計sql,和傳統關係型資料庫有區別,

所以需要去掉原有關係型資料庫下開發的一些固有思維。

基本原則:

1:盡量盡早地過濾資料,減少每個階段的資料量,對於分割槽表要加分割槽,同時只選擇需要使用到的字段

select ... from a

join b

on a.key = b.key

where a.userid>10

and b.userid<10

and a.dt='20120417'

and b.dt='20120417';

應該改寫為:

select .... from (select .... from a

where dt='201200417'

and userid>10

) ajoin ( select .... from b

where dt='201200417'

and userid < 10   

) bon a.key = b.key;

2、對歷史庫的計算經驗  (這項是說根據不同的使用目的優化使用方法)

歷史庫計算和使用,分割槽

3:盡量原子化操作,盡量避免乙個sql包含複雜邏輯

可以使用中間表來完成複雜的邏輯   

4 jion操作   小表要注意放在join的左邊(目前tcl裡面很多都小表放在join的右邊)。

否則會引起磁碟和記憶體的大量消耗

5:如果union all的部分個數大於2,或者每個union部分資料量大,應該拆成多個insert into 語句,實際測試過程中,執行時間能提公升50%

insert overwite table tablename partition (dt= ....)

select ..... from (

select ... from a

union all

select ... from b

union all

select ... from c

) rwhere ...;

可以改寫為:

insert into table tablename partition (dt= ....)

select .... from a

where ...;

insert into table tablename partition (dt= ....)

select .... from b

where ...;

insert into table tablename partition (dt= ....)

select .... from c

where ...; 

5:寫sql要先了解資料本身的特點,如果有join ,group操作的話,要注意是否會有資料傾斜

如果出現資料傾斜,應當做如下處理:

set hive.exec.reducers.max=200;

set mapred.reduce.tasks= 200;---增大reduce個數

set hive.groupby.mapaggr.checkinterval=100000 ;--這個是group的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定

set hive.groupby.skewindata=true; --如果是group by過程出現傾斜 應該設定為true

set hive.skewjoin.key=100000; --這個是join的鍵對應的記錄條數超過這個值則會進行分拆,值根據具體資料量設定

set hive.optimize.skewjoin=true;--如果是join 過程出現傾斜 應該設定為true

(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,則不再聚合

(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的消耗

空閒拉,總結經驗

今天辦完離職,說實話有種輕鬆的感覺,要下周一才去上班,可以放鬆一下下。說實話,這一年感觸還是很多的,1 寧可觀望,也不要把自己賣虧了,總之,我是這次把自己賣虧了,主要找工作之前,我自己休了兩個多月的長假,比較急於上班賺錢。於是就大甩賣了,其實這個成本是在是太大了,有時候就是那麼多忍一忍。2 要找到自...

MT全方面總結經驗

3 電源ic和穩壓管並用 一般以電源ic作為邏輯供電電源,待邏輯部分啟動後再根據需要來驅動穩壓管輸出射頻電路供電。手機供電常見故障有不開機,大電流等,如何檢修則按照上述的工作流程進行跟蹤測量.cpu故障維修 一 cpu啟動 當相應電路得到供電工作後,cpu就應立即啟動,cpu啟動需要三個條件。1 供...

wumii 爆款總結經驗

在正式創辦無秘之前,我們反思前幾次創業失敗的教訓,深刻領悟兩點 第一,內容推薦的精準度取決於平台收集使用者資料的能力,如果沒有使用者行為資料,產品無法做內容推薦,而通過簡單的新聞排序,延長使用者瀏覽單篇文章時間,恰恰體現的是資料價值。金錯刀 魔漫 臉萌一夜爆紅後使用者活躍度持續走低,你如何看待這種現...