hive的優化方式

2021-10-14 10:31:42 字數 2698 閱讀 5928

一、常見的hive的優化方式有哪些

開啟執行計畫

➢explain select …

fetch模式

➢預設是開啟的,開啟後在全域性查詢、字段查詢、limit查詢等都不走mapreduce

本地模式

➢資料量小的時候通過本地模式在單台機器上處理所有的任務

//開啟本地mr

set hive.exec.mode.local.auto=true;

//設定 local mr 的最大輸入資料量,當輸入資料量小於這個值時採用 local mr 的方式

//預設為 134217728,即 128m

set hive.exec.mode.local.auto.inputbytes.max=50000000;

//設定 local mr 的最大輸入檔案個數,當輸入檔案個數小於這個值時採用 local mr 的方式,預設為4

set hive.exec.mode.local.auto.input.files.max=8;

並行執行

➢當某個job包含眾多的階段且這些階段不是完全互相依賴的,就可以並行執行,以縮短整個job的執行時間

set hive.exec.parallel=true;//開啟任務並行執行

set hive.exec.parallel.thread.number=16;//設定最大並行度,預設為8

嚴格模式

➢預設是嚴格模式,是為了防止使用者執行會產生意外影響的查詢。嚴格模式可以限制以下幾點

不允許掃瞄所有分割槽,防止全表掃瞄消耗過大的資源

orderby必須使用limit語句,orderby會將資料分發到同乙個reducer裡,強制使用limit可以防止reducer額外執行很長一段時間

限制笛卡爾積查詢。因為hive不會把where語句轉化為on語句

jvm重用

➢預設配置是使用派生的jvm來執行任務,這種方式下jvm的啟動過程會造成很大的開銷,尤其是task很多的情況。jvm例項的使用次數可以在hadoop的mapred-site.xml檔案中進行配置,通常在10-20之間。

推測執行

➢負載不均衡或資源分布不均等原因,任務之間的執行速度不一致。對於明顯慢的task,採用推測執行(speculative execution)機制,推測出拖後腿的任務並啟動乙個備份任務,和原始任務共同處理同乙份資料,最終選用先成功執行完成的計算結果作為最終結果

檔案壓縮

➢針對io密集型的job,採取檔案壓縮的方式增加吞吐量和效能,減少載入記憶體的資料量;計算密集型的job不適合,因為壓縮和解壓會消耗cpu的使用

➢常見的檔案儲存格式有:textfile、sequence files、rcfile、orcfile、parquet、parquet

在這裡插入描述

表的優化

二、表的優化

大表+小表

➢採用mapjoin,下圖為mapjoin的工作機制

在這裡插入描述

大表+大表

➢空key過濾或空key轉換

map端進行部分聚合

➢group by時某乙個key的數量過多導致對應的reducer負載過大時,採取map端部分聚合的策略。

➢生成兩個mrjob,第乙個mrjob中的map結果會隨機分不到reduce中,做部分聚合操作;第二個mrjob根據預處理的資料結果按照key分布到對應的reduce中。最終完成聚合操作

//是否在 map 端進行聚合,預設為

true set hive.map.aggr = true;

//在 map 端進行聚合操作的條目數目

set hive.groupby.mapaggr.checkinterval = 100000;

//有資料傾斜的時候進行負載均衡(預設是 false)

set hive.groupby.skewindata = true;

count(distinct)去重統計

➢資料量大時,乙個count(distinct)對應的reducetask需要處理的資料量太大,導致job很難完成。因此需要採用先groupby再count的方式替代

避免笛卡爾積

➢hive只能使用1個reducer完成笛卡爾積,會導致計算效能變低

行列過濾

➢在select中只拿需要的列,盡量不用select *;先子查詢,將查詢後的表再關聯主表,提高效率,如果直接join再用where子句過濾,則會先全表關聯再過濾,效率較低

動態分割槽調整

➢不同分割槽在不同資料夾內,在很多情況下可以避免全表掃瞄,提高查詢效率

在這裡插入描述

三、如何防止資料傾斜

1、產生資料傾斜的原因

key 分布不均勻

業務資料本身的特性

建表時考慮不周

某些 sql 語句本身就有

2、資料傾斜通用的處理方法

小檔案進行合併,減少map數

複雜檔案增加map數

設定適當的reduce個數

3、產生資料傾斜的場景和解決方案

group by 產生資料傾斜

➢開啟map端聚合引數設定

➢根據業務合理調整分組維度

select語句中包含 count(distinct)時

➢使用sum(1)… group by替代

➢把傾斜的資料單獨拿出來處理,最後union回去

大表+小表

➢mapjoin

空值產生資料傾斜

➢id為空的不參與關聯

➢給空值分配隨機的key值

hive優化方式總結

1.多表join優化 結構 select from jointables a,b,c with keys a.key,b.key,c.key where 關聯條件相同多表join會優化成乙個job 2.leftsemi join是可以高效實現in exists子查詢的語義 select a.key,...

Hive 筆記五 hive的優化

本地模式 嚴格模式 jvm重用 並行執行 推測還行 合併小檔案 fetch模式 1.列裁剪和分割槽裁剪 列裁剪是在查詢時只讀取需要的列 分割槽裁剪就是只讀取需要的分割槽。2.sort by代替 order by 3.group by 代替count distinct 1 common join 普通...

hive的效能優化

計算資料優化主要有兩種思路,一種是減少處理資料量 一種是解決資料傾斜。資料傾斜一般可以分為三種 join階段資料傾斜 reduce階段資料傾斜 主要有兩種方式 1.2 join階段資料傾斜 是最常見的資料傾斜,按照表的大小和join方式的不同分別有多種處理方式。1.2.1 mapjoin 作用 適用...