計算資料優化主要有兩種思路,一種是減少處理資料量;一種是解決資料傾斜。資料傾斜一般可以分為三種:
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.
name
as
a_name
,b.
name
as
b_name
,c.
name
as
c_name
from
gulfstream_test.a
join
gulfstream_test.b
on
a.id=b.id
join
gulfstream_test.c
on
b.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 使用者介面主要有三個 ...