Hive優化十大原則

2021-08-16 21:24:44 字數 4503 閱讀 7156

一、表鏈結優化

1.將大表放最後

hive假定查詢中最後乙個表是大表,他會將其他表先快取起來,然後掃瞄最後那個表。

因此通常需要將小表放在前面,或者標記那張表是大表:/*streamtable(table_name)*/

2.使用相同的鏈結鍵

當對3個或者更多個表進行join連線時,如果每個on子句都是用相同的連線鍵的話,那麼只會產生乙個mapreduce job。

3.盡量盡早地過濾資料

減少每個階段的資料量,對於分割槽表要加分割槽,同時只選擇需要使用的字段。

4.盡量原子化操作

盡量避免乙個sql包含複雜的邏輯,可以使用中間表來完成複雜的邏輯。

二、使用insert into替換union all

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

例如:

insert overwrite table tablename partition (dt='2018-03-13')

select ... from (select ... from tablename1

union all

select ... from tablename2 union all select ... from tablename3)temp

where ...;

可以改寫成:

insert into table tablename partition (dt = '2018-03-13') select ... from tablename1 where ...;

insert into table tablename partition (dt = '2018-03-13') select ... from tablename2 where ...;

insert into table tablename partition (dt = '2018-03-13') select ... from tablename3 where ...;

三、order by 和 sort by 

order by:對查詢結果進行全域性排序,消耗時間長,需要設定引數(set hive.mapred.mode=nostrict)。

sort by:區域性排序,並非全域性排序,提高效率。

四、transform+python

一種嵌入在hive取資料流程中的自定義函式,通過transform語句可以把在hive中不方便實現的功能在python中實現,然後寫入hive表中。

語法:

select transform()

useing '**.py'

as from

如果除python指令碼外還有其他依賴資源,可以使用add arvhive

五、limit語句快速出結果

一般情況下,limit語句還是需要執行整個查詢語句,然後再返回部分結果。

有乙個配置屬性可以開啟,避免這種情況---對資料來源及逆行抽樣

hive.limit.optimize.enable=true --- 開啟對資料來源進行取樣的功能

hive.limit.row.max.size --- 設定最小的取樣容量

hive.limit.optimize.limit.file --- 設定最大的取樣樣本數

缺點:有可能部分資料永遠不會被處理到

六、本地模式

對於小資料集,為查詢觸發執行任務消耗時間》實際執行job的時間,因此可以通過本地模式,在單台機器上(活某些時候在單個程序上)處理所有的任務。

set oldjobtracker=$;

set mapred.job.tracker=local;

set mapred.tmp.dir=/home/edward/tmp;

sql語句

set mapred.job.tracker=$;

--可以通過設定屬性hive.exec.mode.local.auto的之為true,來讓hive在適當的時候自動啟動這個優化,也可以將這個配置寫在$home/.hiverc檔案中。

--當乙個job滿足如下條件才能真正使用本地模式:

1.job的輸入資料大小必須小於引數:hive.exec.mode.local.auto.inputbytes.max(預設128mb)

2.job的map數必須小於引數:hive.exec.mode.local.auto.tasks.max(預設4)

3.job的reduce數必須為0或者1

可用引數hive.mapred.local.mem(預設0)控制child jvm使用的最大記憶體數。

七、並行執行

hive會將乙個查詢轉化為乙個或多個階段,包括:mapreduce階段、抽樣階段、合併階段、limit階段等。預設情況下,一次只執行乙個階段。不過,如果某些階段不是相互依賴,是可以並行執行的。

set hive.execparallel=true 可以開啟併發執行

set hive.exec.parallel.thread.number=16 同乙個sql允許最大並行度,預設為8

會比較耗系統資源

1.map階段優化

map個數的主要的決定因素有:input的檔案總個數,input的檔案大小,集群設定的檔案塊大小(預設128m,不可自定義)。

舉例:a、假設input目錄下有乙個檔案a,大小為780m,那麼hadoop會將該檔案a分割成7個塊(6個128m的塊和1個12m的塊),從而產生7個map數

b、假設input目錄下有三個檔案a,b,c大小分別為10m,20m,130m,那麼hadoop會分割成4個塊(10m,20m,128m,2m),從而生產4個map數,即:如果檔案大於塊大小(128m),那麼會拆份,如果小於塊大小,則把該檔案當成乙個塊。

1)減少map數

若有大量小檔案(小於128m),會產生多個map,處理方法是:

set mapred.max.split.size=100000000;

set mapred.min.split.size.per.node=100000000;

set mapred.min.split.size.per.rack=100000000;

--前面三個引數確定合併檔案塊的大小,大於檔案塊大小128m的,按照128m來分割,小於128m,大於100m的,按照100m來分割,把那些小於100m的(包括小檔案和分割大檔案剩下的)進行合併

set hive.input.format=org.apache.hadoop.hive.ql.io.conmbinehiveinputformat; --執行前進行小檔案合併
2)增加map數

當input的檔案都很大,任務邏輯複雜,map執行非常慢的時候,可以考慮增加map數,來使得每個map處理的資料量減少,從而提高任務的執行效率。

set mapred.reduce.tasks=?
2.reduce階段

調整方式:

--set mapred.reduce.tasks=?

--set hive.exec.reducers.bytes.per.reducer=?

一般根據輸入檔案的總大小,用它的estimation函式來自動計算reduce的個數:reduce個數=inputfilesize/butes per reducer

九、嚴格模式

set hive.marped.mode=strict ---防止使用者執行那些可能意想不到的不好的影響的查詢

--分割槽表,必須選定分割槽範圍

--對於使用order by的查詢,要求必須使用limit語句。因為order by為了執行排序過程會將所有的結果資料分發到同乙個reducer中進行處理。

--限制笛卡爾積查詢:兩張表join時必須有on語句

十、資料傾斜

表現:任務進度長時間維持在99%(或100%),檢視任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因為其處理的資料量和其他reduce差異過大。單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多,最長時長遠大於平均時長。

原因:1.key分布不均勻

2.業務資料本身的特性

3.建表時考慮不周

4.某些sql語句本身就有資料傾斜

情形後果

join

其中乙個表較小,但是key集中

分發到某乙個或幾個reduce上的資料遠高於平均值

join

大表與大表,但是分桶的判斷欄位0值或者空值過多

這些空值都由乙個reduce處理,非常慢

group by

group by 維度過小,某值的數量過多

處理某只的reduce非常耗時

count distinct

某特殊值過多

處理次特殊值reduce耗時

解決方案:hive.map.aggr=true

參考文獻:

1. 《hive程式設計指南》edward capriolo

hive優化十大原則

hive之於資料民工,就如同鋤頭之於農民伯伯。hive用的好,才能從地里 資料庫 裡挖出更多的資料來。用過hive的朋友,我想或多或少都有類似的經歷 一天下來,沒跑幾次hive,就到下班時間了。hive在極大資料或者資料不平衡等情況下,表現往往一般,因此也出現了presto spark sql等替代...

測試十大原則

1.所有測試的標準都是建立在使用者需求之上。正如我們所知,測試的目標就是驗證產品的一致性和確認產品是否滿足客戶的需求,所以測試人員要始終站在使用者的角度去看問題 去判斷軟體缺陷的影響,系統中最嚴重的錯誤是那些導致程式無法滿足使用者需求的缺陷。2.軟體測試必須基於 質量第一 的思想去開展各項工作,當時...

軟體測試的十大原則

軟體測試的十大原則 原則是最重要的,方法應該在這個原則指導下進行。軟體測試的基本原則是站在使用者的角度,對產品進行全面測試,盡早 盡可能多地發現 bug,並負責跟蹤和分析產品中的問題,對不足之處提出質疑和改進意見。零缺陷 zero bug 是一種理念,足夠好 good enough 是測試的基本原則...