hive的效能優化

2021-08-20 20:07:13 字數 3007 閱讀 2332

計算資料優化主要有兩種思路,一種是減少處理資料量;一種是解決資料傾斜。資料傾斜一般可以分為三種:

join階段資料傾斜

reduce階段資料傾斜

主要有兩種方式:

1.2  join階段資料傾斜

是最常見的資料傾斜,按照表的大小和join方式的不同分別有多種處理方式。

1.2.1 mapjoin

作用:適用場景:

不適用場景:

限制:set hive.auto.convert.join = true

使用mapjoin,只有map,沒有reduce任務

1.2.2 mapjoin+left join

作用:適用場景:

1.2.3  先group by再mapjoin

作用:適用場景:

優化方式:

1.2.4 先過濾在關聯

作用:適用場景:

不適用場景:

1.2.5 關聯key隨機化處理

作用:適用場景:

不適用場景:

1.2.6 分成兩段程式處理後union all

作用:適用場景:

缺陷:1.2.7 join中的分割槽裁剪失效

是發生在left outer join中,內關聯不會的。本質是sql子句的執行順序問題,內關聯where和on是等效的,先篩選再關聯,左關聯時是先on中條件篩選,再關聯,最後再where條件過濾,所以放在where裡肯定會失效。

1.3 reduce 階段的資料傾斜

reduce階段的資料傾斜一般是由以下幾種原因引起的:

1.3.1 group by後面的字段值存在資料傾斜

設定  set hive.groupby.skewindata=true

作用:適用場景:

1.3.2  用打標+聚合的方式代替distinct的聚合

作用:適用場景:

1.3.3 利用視窗函式

利用視窗函式可以減少1次join操作,從而提高計算效能

2、需要同時提取明細資料和彙總資料,可以採用視窗函式。

1.3.4  用max函式替代row_number排序取第一

作用:適用場景:

1.4  增加中間表減少任務資料處理量

作用:適用場景:

1.5  增加分割槽減少後續任務資料處理量

作用:適用場景:

這個欄位可列舉,數值不宜太多,多了表資料不能保留太久。使用這個字段作為條件能有效減少記錄數,如果這個字段記錄數集中在某乙個值上,且後續都是用這個值過濾,那就不太適合;

計算步驟優化主要是為了減少單個sql中的task的數量。

2.1  多表join盡量保持join key一致

作用:具體案例:

create table a(id bigint,name string);

create table b(id bigint,name string);

create table c(id bigint,name string);

關聯的key相同,字段型別也一致,只有乙個join任務:

select

a.nameasa_name

,b.nameasb_name

,c.nameasc_name

fromgulfstream_test.a

joingulfstream_test.b

ona.id=b.id

joingulfstream_test.c

onb.id=c.id;

2.2  多路插入

作用:一次完成同乙份資料的多種不同處理。

具體案例:

訂單表裡面有訂單id、司機id、乘客id,需要統計司機的訂單數和乘客的訂單數。

不使用多路插入,需要讀取原表兩次。

reduce又可以分為join和reduce兩種,join是多表join時的reduce個數,reduce是計算的時候的reduce個數。

適用場景:

不適用場景:

set mapred.max.split.size=64000000;(預設256m) 乙個split最大的大小

set mapred.min.split.size.per.node=64000000;//(預設256m)乙個節點上乙個split的至少的大小

set mapred.min.split.size.per.rack=64000000;//(預設256m)乙個交換機下乙個split至少的大小

適用場景:

set mapred.max.split.size=512000000;(預設 256000000) 乙個split最大的大小

set mapred.min.split.size.per.node=512000000;//(預設 256000000)乙個節點上乙個split的至少的大小

set mapred.min.split.size.per.rack=512000000;//(預設 256000000)乙個交換機下乙個split至少的大小

3.3  增加reduce的instance個數

目的:減少任務的執行時間

適用場景:

增加reduce的instance個數,可以調整hive.exec.reducers.bytes.per.reducer引數的值;

例如:set hive.exec.reducers.bytes.per.reducer=64000000; (64m)

hive效能優化

向量查詢 vectorized query 每次處理資料時會將1024行資料組成乙個batch進行處理,而不是一行一行進行處理,這樣能夠顯著提高執行速度。可以通過設定 error error while processing statement failed execution error,retu...

Hive效能優化大全

核心思想 是將hive程式當做mapreduce程式進行優化 hive中sql語句轉化為mapreduce的過程,整個編譯過程分為6個階段 1 antlr定義sql的語法規則,完成sql詞法,語法解析,將sql轉化為 抽象語法樹ast tree。2 遍歷抽象語法樹ast tree,抽象出查詢的基本組...

hive基本介紹以及效能優化

hive是建立在hadoop上的資料倉儲基礎架構。它提供了一系列的工具,可以用來進行資料提取轉化載入 etl 這是一種可以儲存 查詢和分析儲存在hadoop中大規模資料的機制。最大的有點就是定義了類sql語言,稱為hql。1.1 結構描述 hive的結構可以分為以下幾部分 1 使用者介面主要有三個 ...