1. 程式人生 > >## Hive分割槽、桶、與傾斜

## Hive分割槽、桶、與傾斜

Hive的分割槽

(1)在Hive Select 查詢中一般會掃描整個表內容,會消耗很多時間做沒必要的工作。有時候查詢 只需要掃描表中關心的一部分資料,因此建表時引入partition概念。

(2)分割槽表指的是在建立表時指定的partition的分割槽空間。

(3)如果需要建立有分割槽的表,需要在create表的時候呼叫可選引數partition by ,詳細見表建立的語法結構。

(4) 一個表可以擁有一個或者多個分割槽,每個分割槽以資料夾的形式單獨儲存在表文件夾的目錄下。

(5)表和列名不區分大小寫。


(6) 分割槽是以欄位的形式在表結構中存在的,通過dsscribe table 命令可以檢視到欄位存在,但是該欄位 不存放實際的資料內容,僅僅是分割槽的表示

Hive的桶表

分桶其實就是把大表化成了‘小表’,然後通過兩個表相同列使用Map端連線(Map-Side Join),這就是用來解決大表與小表之間的連線問題。將桶中的資料按某列進行排序會提高查詢效率。

(1)建立分桶表

CREATE TABLE tb_bucket_shop (
shop_id int,
shop_name string,
shopkeeper string,
) CLUSTERED BY (shop_id) INTO 4BUCKETS


ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

(2)資料匯入

set hvie.enforce.bucketing=true; INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name, shopkeeper FROM tb part shop CLUSTER BY shop id;

若沒有使用hive. enforce.bucketing屬性,則需要設定和分桶個數相匹配的reducer個數,同時SELECT後新增CLUSTER BY

set mapred.mapred.reduce.tasks=4;


INSERT OVERWRITE TABLE tb_bucket_shop SELECT shop_id, shop_name,
shopkeeper FROM tb part shop CLUSTER BY shop id;

分桶適合於sampling(取樣),不過其資料正確地匯入到hive表中,需要使用者自己來證明,因為table中資訊僅僅是元資料,而不影響實際填充表的命令。

(3)小結

分割槽分桶是hive效能優化的一個手段,不同的欄位,其數值屬性不同,其對應的有優化當時也不同,不能簡單地認為分割槽分桶對應傳統關係型資料庫的分庫分表,兩者完全不一樣。

Hive資料傾斜

(1)資料傾斜的原因

使map的輸出資料更均勻的分佈到Reduce中,是我們的最終目標。由於Hash演算法的侷限性,按key Hash會或多或少地造成資料傾斜。大量經驗表明資料傾斜的原因是人為的建表疏忽或業務邏輯,是可以規避的。

(2)解決思路

Hive的執行是分段的,map處理資料量的差異取決於上一個stage的reduce輸出,所以如何將資料均勻地分配到各個reduce中,就是解決資料傾斜的根本原因所在。

(3)具體辦法

  • 記憶體優化和I/O優化。

  • 驅動表:使用大表做驅動表,以防止記憶體溢位;Join最右邊的表是驅動表;Mapjoin無視join順序,用大表做驅動表。

Mapjoin是一種避免資料傾斜的手段

允許在map階段進行join操作,MapJoin把小表全部讀入記憶體中,在map階段直接拿另外一個表的資料和記憶體中表資料做匹配。由於對map進行了join操作,省去了reduce執行,效率也會高很多。

在對多個表join連線操作時,將小表放在join的左邊,大表放在join的右邊。在執行這樣的join連線時,小表中的資料會被快取到記憶體當中,這樣可以有效減少發生記憶體溢位錯誤的機率。

(1)設定引數

hive.map.aggr=true
hive.groupby.skewindata=true

還有其他引數,請小夥伴自行官網看相關文件。

(2)SQL語言調節

比如:在group by 維度過小時,採用sum() group by 的方式 來替換count(distinct)完成計算。

(3)StreamTable

將在reduce中進行join操作時的小table放入記憶體,而大table通過stream方式讀取。

(4)索引

Hive從0.80開始才有索引,它提供了一個Bitmap點陣圖索引,索引可以加快group by查詢語句的執行速度,但是用的比較少。