01.29 Hive 用戶指南 v1.0

Hive 用戶指南 v1.0


Hive 用戶指南 v1.0


1. HIVE 結構 Hive 是建立在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,可以用來進行數

據提取轉化加載(ETL),這是一種可以存儲、查詢和分析存儲在 Hadoop 中的大規模數據的

機制。Hive 定義了簡單的類 SQL 查詢語言,稱為 QL,它允許熟悉 SQL 的用戶查詢數據。

同時,這個語言也允許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理

內建的 mapper 和 reducer 無法完成的複雜的分析工作。

1.1 HIVE 架構

Hive 的結構可以分為以下幾部分:

• 用戶接口:包括 CLI, Client, WUI • 元數據存儲。通常是存儲在關係數據庫如 mysql, derby 中

• 解釋器、編譯器、優化器、執行器 • Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算

1、 用戶接口主要有三個:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 啟動的時候,會同時啟動一個 Hive 副本。Client 是 Hive 的客戶端,用戶連接至 Hive Server。

在啟動 Client 模式的時候,需要指出 Hive Server 所在節點,並且在該節點啟動 Hive

Server。 WUI 是通過瀏覽器訪問 Hive。

2、 Hive 將元數據存儲在數據庫中,如 mysql、derby。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。

3、 解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,並在隨後有 MapReduce 調用執行。

4、 Hive 的數據存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from tbl 不會生成 MapRedcue 任務)。

1.2 Hive 和 Hadoop 關係

Hive 構建在 Hadoop 之上,

• HQL 中對查詢語句的解釋、優化、生成查詢計劃是由 Hive 完成的 • 所有的數據都是存儲在 Hadoop 中 • 查詢計劃被轉化為 MapReduce 任務,在 Hadoop 中執行(有些查詢沒有 MR 任

務,如:select * from table)

• Hadoop 和 Hive 都是用 UTF-8 編碼

1.3 Hive 和普通關係數據庫的異同

Hive RDBMS

查詢語言 HQL SQL

數據存儲 HDFS Raw Device or Local FS

索引 無 有

執行 MapReduce Excutor

執行延遲 高 低

處理數據規模 大 小

1. 查詢語言。由於 SQL 被廣泛的應用在數據倉庫中,因此,專門針對 Hive 的特性設計了類 SQL 的查詢語言 HQL。熟悉 SQL 開發的開發者可以很方便的使用 Hive 進行開

發。

2. 數據存儲位置。Hive 是建立在 Hadoop 之上的,所有 Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。

3. 數據格式。Hive 中沒有定義專門的數據格式,數據格式可以由用戶指定,用戶定義數據格式需要指定三個屬性:列分隔符(通常為空格、"\\t"、"\\\\x001″)、行分隔符

("\\n")以及讀取文件數據的方法(Hive 中默認有三個文件格式 TextFile,

SequenceFile 以及 RCFile)。由於在加載數據的過程中,不需要從用戶數據格式到

Hive 定義的數據格式的轉換,因此,Hive 在加載的過程中不會對數據本身進行任何修

改,而只是將數據內容複製或者移動到相應的 HDFS 目錄中。而在數據庫中,不同的數

據庫有不同的存儲引擎,定義了自己的數據格式。所有數據都會按照一定的組織存儲,

因此,數據庫加載數據的過程會比較耗時。

4. 數據更新。由於 Hive 是針對數據倉庫應用設計的,而數據倉庫的內容是讀多寫少的。因此,Hive 中不支持對數據的改寫和添加,所有的數據都是在加載的時候中確定好的。

而數據庫中的數據通常是需要經常進行修改的,因此可以使用 INSERT

INTO ... VALUES 添加數據,使用 UPDATE ... SET 修改數據。

5. 索引。之前已經說過,Hive 在加載數據的過程中不會對數據進行任何處理,甚至不會對數據進行掃描,因此也沒有對數據中的某些 Key 建立索引。Hive 要訪問數據中滿足

條件的特定值時,需要暴力掃描整個數據,因此訪問延遲較高。由於 MapReduce 的引

入, Hive 可以並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive 仍然

可以體現出優勢。數據庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特

定條件的數據的訪問,數據庫可以有很高的效率,較低的延遲。由於數據的訪問延遲較

高,決定了 Hive 不適合在線數據查詢。

6. 執行。Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的(類似 select * from tbl 的查詢不需要 MapReduce)。而數據庫通常有自己的執行引擎。

7. 執行延遲。之前提到,Hive 在查詢數據的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce 框架。由於

MapReduce 本身具有較高的延遲,因此在利用 MapReduce 執行 Hive 查詢時,也會有

較高的延遲。相對的,數據庫的執行延遲較低。當然,這個低是有條件的,即數據規模

較小,當數據規模大到超過數據庫的處理能力的時候,Hive 的並行計算顯然能體現出

優勢。

8. 可擴展性。由於 Hive 是建立在 Hadoop 之上的,因此 Hive 的可擴展性是和 Hadoop 的可擴展性是一致的(世界上最大的 Hadoop 集群在 Yahoo!,2009 年的規模在 4000 臺

節點左右)。而數據庫由於 ACID 語義的嚴格限制,擴展行非常有限。目前最先進的並

行數據庫 Oracle 在理論上的擴展能力也只有 100 臺左右。

9. 數據規模。由於 Hive 建立在集群上並可以利用 MapReduce 進行並行計算,因此可以支持很大規模的數據;對應的,數據庫可以支持的數據規模較小。

1.4 HIVE元數據庫

Hive 將元數據存儲在 RDBMS 中,一般常用的有 MYSQL 和 DERBY。

1.4.1 DERBY

啟動 HIVE 的元數據庫

進入到 hive 的安裝目錄

Eg:

1、啟動 derby 數據庫

/home/admin/caona/hive/build/dist/

運行 startNetworkServer -h 0.0.0.0


2、連接 Derby 數據庫進行測試

查看/home/admin/caona/hive/build/dist/conf/hive-default.xml。

找到<property>

<name>javax.jdo.option.ConnectionURL/<name>

<value>jdbc:derby://hadoop1:1527/metastore_db;create=true/<value>

<description>JDBC connect string for a JDBC metastore/<description>

進入 derby 安裝目錄

/home/admin/caona/hive/build/dist/db-derby-10.4.1.3-bin/bin

輸入./ij

Connect 'jdbc:derby://hadoop1:1527/metastore_db;create=true';


3、元數據庫數據字典

表名 說明 關聯鍵

BUCKETING_COLS

COLUMNS Hive 表字段信息(字段註釋,字段名,字段類型,字段序號) SD_ID


DBS 元數據庫信息,存放 HDFS 路徑信息 DB_ID

PARTITION_KEYS Hive 分區表分區鍵 PART_ID

SDS 所有 hive 表、表分區所對應的 hdfs 數據目錄和數據格式。 SD_ID,SERDE_ID

SD_PARAMS 序列化反序列化信息,如行分隔符、列分隔符、NULL 的表示

字符等 SERDE_ID

SEQUENCE_TABLE

SEQUENCE_TABLE 表保存了 hive 對象的下一個可用 ID,

如'org.apache.hadoop.hive.metastore.model.MTable',

21,則下一個新創建的 hive 表其 TBL_ID 就是 21,同時

SEQUENCE_TABLE 表中 271786 被更新為 26(這裡每次都是

+5?)。同樣,COLUMN,PARTITION 等都有相應的記錄


SERDES

SERDE_PARAMS

SORT_COLS

TABLE_PARAMS 表級屬性,如是否外部表,表註釋等 TBL_ID

TBLS 所有 hive 表的基本信息 TBL_ID,SD_ID


從上面幾張表的內容來看,hive 整個創建表的過程已經比較清楚了

1. 解析用戶提交 hive 語句,對其進行解析,分解為表、字段、分區等 hive 對象 2. 根據解析到的信息構建對應的表、字段、分區等對象,從 SEQUENCE_TABLE 中獲取構

建對象的最新 ID,與構建對象信息(名稱,類型等)一同通過 DAO 方法寫入到元數據

表中去,成功後將 SEQUENCE_TABLE 中對應的最新 ID+5。

實際上我們常見的 RDBMS 都是通過這種方法進行組織的,典型的如 postgresql,其系

統表中和 hive 元數據一樣裸露了這些 id信息(oid,cid 等),而 Oracle 等商業化的系統則隱

藏了這些具體的 ID。通過這些元數據我們可以很容易的讀到數據諸如創建一個表的數據字

典信息,比如導出建表語名等。

導出建表語句的 shell 腳本見附一 待完成

1.4.2 Mysql

將存放元數據的 Derby 數據庫遷移到 Mysql 數據庫

步驟:

1.5 HIVE 的數據存儲

首先,Hive 沒有專門的數據存儲格式,也沒有為數據建立索引,用戶可以非常自由的組織 Hive 中的表,只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就可以解析數據。

其次,Hive 中所有的數據都存儲在 HDFS 中,Hive 中包含以下數據模型:Table,External Table,Partition,Bucket。

1. Hive 中的 Table 和數據庫中的 Table 在概念上是類似的,每一個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表 xiaojun,它在 HDFS 中的路徑為:/ warehouse /xiaojun,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,所有的 Table 數據(不包括 External Table)都保存在這個目錄中。

2. Partition 對應於數據庫中的 Partition 列的密集索引,但是 Hive 中 Partition 的組織方式和數據庫中的很不相同。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中。例如:xiaojun 表中包含 dt 和 city 兩個 Partition,則對應於 dt = 20100801, ctry = US 的 HDFS 子目錄為:/ warehouse /xiaojun/dt=20100801/ctry=US;對應於 dt = 20100801, ctry = CA 的 HDFS 子目錄為;/ warehouse /xiaojun/dt=20100801/ctry=CA

3. Buckets 對指定列計算 hash,根據 hash 值切分數據,目的是為了並行,每一個 Bucket 對應一個文件。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值為 0 的 HDFS 目錄為:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00000;hash 值為 20 的 HDFS 目錄為:/ warehouse /xiaojun/dt =20100801/ctry=US/part-00020

4. External Table 指向已經在 HDFS 中存在的數據,可以創建 Partition。它和 Table 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。

• Table 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之後對數據對訪問將會直

接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。 • External Table 只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL

TABLE ……LOCATION),實際數據是存儲在 LOCATION 後面指定的 HDFS 路徑中,並不會移動到數據倉庫目錄中。當刪除一個 External Table 時,僅刪除


1.6 其它 HIVE 操作


1、 啟動 HIVE 的 WEB 的界面 sh $HIVE_HOME/bin/hive --service hwi


2、查看 HDFS 上的文件數據

hadoop fs -text /user/admin/daiqf/createspu_fp/input/cateinfo |head


分享到:


相關文章: