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