文章目錄
1. Hive結構介紹
2. 結構描述
2.1 用戶接口主要有三個:CLI,Client 和 WUI
2.2 Hive 將元數據存儲在數據庫中,如 mysql、derby
2.3 解釋器、編譯器、優化器、執行器
3. Hive 和普通 DB 的異同
4. 元數據
5. 數據存儲html
1. Hive結構介紹
Hive 構建在Hadoop的HDFS和MapReduce之上,用於管理和查詢結構化/非結構化數據的數據倉庫。mysql
- 使用 HQL 做爲查詢接口
- 使用 HDFS 做爲底層存儲
- 使用 MapReduce 做爲執行層
2. 結構描述
Hive 的結構能夠分爲如下幾部分:sql
- 用戶接口:包括 CLI, Client, WUI
- 元數據存儲:一般是存儲在關係數據庫如 mysql, derby 中
- 解釋器、編譯器、優化器、執行器
- Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算
2.1 用戶接口主要有三個:CLI,Client 和 WUI
其中最經常使用的是 CLI,Cli 啓動的時候,會同時啓動一個 Hive 副本。Client 是 Hive 的客戶端,用戶鏈接至 Hive Server。在啓動 Client 模式的時候,須要指出 Hive Server 所在節點,而且在該節點啓動 Hive Server。 WUI 是經過瀏覽器訪問 Hive。
數據庫
2.2 Hive 將元數據存儲在數據庫中,如 mysql、derby
Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否爲外部表等),表的數據所在目錄等。
apache
2.3 解釋器、編譯器、優化器、執行器
解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,並在隨後有 MapReduce 調用執行。
瀏覽器
Hive 的數據存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,好比 select * from tbl 不會生成 MapRedcue 任務)。app
3. Hive 和普通 DB 的異同
/ |
Hive |
RMDBS |
查詢語言 |
HQL |
SQL |
數據延遲 |
HDFS |
Raw Device or Local FS |
執行 |
MapReduce |
Excutor |
執行延遲 |
高 |
低 |
處理數據規模 |
大 |
小 |
索引 |
0.8版本後加入位圖索引 |
有複雜的索引 |
可參考連接:issues.apache.org/jira/browse…oop
4. 元數據
Hive 將元數據存儲在 RDBMS 中,通常經常使用的有MYSQL和DERBY。因爲DERBY只支持單客戶端登陸,因此通常採用MySQL來存儲元數據。優化
5. 數據存儲
首先,Hive 沒有專門的數據存儲格式,也沒有爲數據創建索引,用戶能夠很是自由的組織 Hive 中的表,只須要在建立表的時候告訴 Hive 數據中的列分隔符和行分隔符,Hive 就能夠解析數據。xml
其次,Hive 中全部的數據都存儲在 HDFS 中,Hive 中包含如下數據模型:Table,External Table,Partition,Bucket。
- Hive 中的 Table 和數據庫中的 Table 在概念上是相似的,每個 Table 在 Hive 中都有一個相應的目錄存儲數據。例如,一個表 app,它在 HDFS 中的路徑爲:/ warehouse /app,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,全部的 Table 數據(不包括 External Table)都保存在這個目錄中。
- Partition 對應於數據庫中的 Partition 列的密集索引,可是 Hive 中 Partition 的組織方式和數據庫中的很不相同。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,全部的 Partition 的數據都存儲在對應的目錄中。例如:xiaojun 表中包含 dt 和 city 兩個 Partition,則對應於 dt = 20100801, ctry = US 的 HDFS 子目錄爲:/ warehouse /app/dt=20100801/ctry=US;對應於 dt = 20100801, ctry = CA 的 HDFS 子目錄爲;/ warehouse /app/dt=20100801/ctry=CA
- Buckets 對指定列計算 hash,根據 hash 值切分數據,目的是爲了並行,每個 Bucket 對應一個文件。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值爲 0 的 HDFS 目錄爲:/ warehouse /app/dt =20100801/ctry=US/part-00000;hash 值爲 20 的 HDFS 目錄爲:/ warehouse /app/dt =20100801/ctry=US/part-00020
- External Table 指向已經在 HDFS 中存在的數據,能夠建立 Partition。它和 Table 在元數據的組織上是相同的,而實際數據的存儲則有較大的差別。
- Table (內部表)的建立過程和數據加載過程(這兩個過程能夠在同一個語句中完成),在加載數據的過程當中,實際數據會被移動到數據倉庫目錄中;以後對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。
External Table 只有一個過程,加載數據和建立表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數據是存儲在 LOCATION 後面指定的 HDFS 路徑中,並不會移動到數據倉庫目錄中。當刪除一個 External Table 時,僅刪除hive的元數據,不會刪除hdfs上對應的文件。
參考文檔:
- www.cnblogs.com/smartloli/p…
- issues.apache.org/jira/browse…
- www.cnblogs.com/smartloli/p…