Hive概述 體系架構 分割槽 桶與傾斜 環境搭建

2021-08-17 16:24:45 字數 3353 閱讀 6091

hive 是基於hadoop 的乙個資料倉儲工具,可以將結構化的資料檔案對映為一張資料庫表,並提供完整的sql查詢功能,可以將sql語句轉換為mapreduce任務進行執行。其優點是學習成本低,可以通過類sql語句快速實現簡單的mapreduce統計,不必開發專門的mapreduce應用,十分適合資料倉儲的統計分析。

1.hive 與關聯式資料庫的區別

(1) hive 和關聯式資料庫儲存檔案的系統不同,hive 使用的是hadop 的hdfs(hadoop 的分布式檔案系統),關聯式資料庫則是伺服器本地的檔案系統。

(2) hive 使用的計算模型是mapreduce,而關聯式資料庫則是自己設計的計算模型。

(3) 關聯式資料庫都是為實時查詢的業務進行設計的,而hive 則是為海量資料做資料探勘設計的,實時性很差; 實時性的區別導致hive 的應用場景和關聯式資料庫有很大的不同。

(4) hive 很容易擴充套件自己的儲存能力和計算能力,這個是繼承hadoop的,而關係數庫在這個方面要比hive 差很多。

2.hive 架構介紹

架構圖如下:

hive 的體系結構可以分為以下幾部分:

(1) 使用者介面主要有三個: cli client 和wui。其中最常用的是cli,cli 啟動的的候,會同時啟動乙個hive 副本。client 是hive 的客戶端,使用者連線至hive server。在啟動client 模式的時候,需要指出hive server 所在節點,並且在該節點啟動hive server。wul是通過瀏覽器訪問hive 的。

(2) hive 將元資料儲存在資料庫中,如mysql、derby。hive 中的元資料報括表的名子、表的列、表的分割槽、表的屬性(是否為外部表等)、表的資料所在目錄等。

(3)直譯器、編譯器、優化器完成hol 查詢語句。生成的查詢計畫儲存在hdfs 中,並在隨後有mapreduce 呼叫執行。

(4)hive的資料儲存在hdfs中,大部分的查詢、計算由mapreduce 完成(包含的*查詢。比如select * from 不會生成mapreduce任務)。hie將元資料儲存在rdbas中。

hive的內建資料型別可以分為兩大類:

1)基礎資料型別

2)複雜資料型別

1、基礎資料型別

基礎資料型別包括:tinyint、smallint、int、bigint、boolean、float、double、string、binary、timestamp、decimap、char、varchar、date。hive基礎資料型別如圖所示,下面的**列出這些基礎型別所佔的位元組以及hive從什麼版本開始支援這些型別。

2、複雜資料型別

,pssword 是value; 那麼我們可以通過userlist['username']來得到這個使用者對應的passwod。

(3) struct:struct可以包含不同資料型別的元素,可以通過「點語法」的方式來得到所需要的元素,比如user是乙個struct型別,那麼可以通過user.address得到這個使用者的位址。

(4) union:unontype這個資料型別是從hive0.7.0 開始支援的。

3、內部表和外部表的區別

1)建立表時:hive預設建立的是內部表,建立內部表時,會將資料移動到資料倉儲指向的路徑;

若建立外部表,僅記錄資料所在的路徑,

不對資料的位置做任何改變。

2)刪除表時:在刪除表的時候,內部表的元資料和資料會被一起刪除,

而外部表只刪除元資料,不刪除資料。這樣外部表相對來說更加安全些,資料組織也更加靈活,方便共享源資料。

1、hive的分割槽

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

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

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

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

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

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

2、hive桶表

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

(1)建立分桶表

(2)資料匯入

(3)小結:

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

3、hive的資料傾斜

(1) 資料傾斜的原因

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

(2) 解決思路

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

(3) 具體辦法

記憶體優化和io 優化。

驅動表: 使用大表做驅動表,以防止記憶體濫出; join 最右邊的表是驅動表: mapjoin無視join 順序,用大表做驅動表。

4、mapjoin是一種避免資料傾斜的手段

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

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

一、設定引數

hive.map.aggr = true

hive.groupby.skewindata=true

二、sql語言調節

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

三、stream table

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

四、索引

hive從0.80開始才有索引,它提供來乙個bitmap點陣圖索引,索引可以加快 group by 查詢語句的執行速度,但用得較少。

Hive分割槽和桶

smb 存在的目的主要是為了解決大表與大表間的 join 問題,分桶其實就是把大表化成了 小表 然後 map side join 解決之,這是典型的分而治之的思想。在聊 smb join 之前,我們還是先複習下相關的基礎概念。在hive select查詢中一般會掃瞄整個表內容,會消耗很多時間做沒必要...

Hive分割槽 分桶

create table t user partition id int name string partitioned by country string row format delimited fields terminated by load data local inpath root h...

Hive分割槽 分桶

2 靜態分割槽 二 hive分桶 1.分割槽列的值將表劃分為乙個個的資料夾 2.查詢時語法使用 分割槽 列和常規列類似 3.查詢時hive會只從指定分割槽查詢資料,提高查詢效率 建立單級分割槽表 create table ifnot exists employee partition name st...