Hive調優

Hive建表優化

1,分區,分桶 一般是按照業務日期進行分區 每天的數據放在一個分區里

2,一般使用外部表,避免數據誤刪

3,選擇適當的文件儲存格式及壓縮格式

4,命名要規範

5,數據分層,表分離,但是也不要分的太散

Hive查詢優化

分區裁剪 where過濾,

先過濾,後join 分區分桶,

合併小文件 適當的子查詢(小表全局廣播,左連是大表在左,小表在右)

order by 語句: 是全局排序

sort by 語句: 是單reduce排序

distribute by語句: 是分區欄位

cluster by語句: 可以確保類似的數據的分發到同一個reduce task中,並且保證數據有序防止所有的數據分發到同一個reduce上,導致整體的job時間延長

cluster by語句的等價語句: distribute by Word sort by Word ASC

Hive數據傾斜優化

 原因:key分布不均勻,數據重複

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

 解決方案:

 1、從數據源頭,業務層面進行優化
 2、找到key重複的具體值,進行拆分,hash。非同步求和。(增加隨機數,加鹽,可以在key後concat拼接數,最後split切分)

 hive> select key,count(*) from data_skew group by key;  (沒有優化前)

hive> select t.key,sum(t.c) from       
> (select key,if(key==’84401′ or key==’null’,floor(8*rand()),0) as hash_key,count(*) as c
> from data_skew group by key,if(key==’84401′ or key==’null’,floor(8*rand()),0)) t
> group by t.key;

Hive作業優化

調整mapper和reducer的數量

太多map導致啟動產生過多開銷

按照輸入數據量大小確定reducer數目set mapred.reduce.tasks= 默認3

dfs -count /分區目錄/*

hive.exec.reducers.max設置阻止資源過度消耗

參數調節

set hive.map.aggr = true (hive2默認開啟)

Map 端部分聚合,相當於Combiner

hive.groupby.skewindata=true

Tags: