Hive体系结构(一)架构与基本组成
Hive體系結構(一)架構與基本組成
Hive體系結構(二)Hive的執行原理、與關系型數據庫的比較
Hive體系結構(三)元數據庫與基本操作
Hive體系結構(四)注意事項與擴展特性
1 Hive的體系結構劃分
下面是Hive的架構圖:
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任務)。
2 連接到數據庫的模式
2.1 單用戶模式
此模式連接到一個In-memory 的數據庫Derby,一般用于Unit Test。
2.2 多用戶模式
通過網絡連接到一個數據庫中,是最經常使用到的模式。
2.3 遠程服務器模式
用于非Java客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用Thrift協議通過MetaStoreServer訪問元數據庫。
3 Hive的數據模型
對于數據存儲,Hive沒有專門的數據存儲格式,也沒有為數據建立索引,用戶可以非常自由的組織Hive中的表,只需要在創建表的時候告訴Hive數據中的列分隔符和行分隔符,Hive就可以解析數據。
Hive中所有的數據都存儲在HDFS中,存儲結構主要包括數據庫、文件、表和視圖。
Hive中包含以下數據模型:Table內部表,External Table外部表,Partition分區,Bucket桶。Hive默認可以直接加載文本文件,還支持sequence file 、RCFile。
3.1 Hive數據庫
類似傳統數據庫的DataBase,在第三方數據庫里實際是一張表。簡單示例命令行 hive > create database test_database;
3.2 內部表
Hive的內部表與數據庫中的Table在概念上是類似。每一個Table在Hive中都有一個相應的目錄存儲數據。例如一個表pvs,它在HDFS中的路徑為/wh/pvs,其中wh是在hive-site.xml中由${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,所有的Table數據(不包括External Table)都保存在這個目錄中。刪除表時,元數據與數據都會被刪除。
內部表簡單示例:
創建數據文件:test_inner_table.txt 創建表:create table test_inner_table (key string) 加載數據:LOAD DATA LOCAL INPATH 'filepath' INTO TABLE test_inner_table 查看數據:select * from test_inner_table; select count(*) from test_inner_table 刪除表:drop table test_inner_table3.3 外部表
外部表指向已經在HDFS中存在的數據,可以創建Partition。它和內部表在元數據的組織上是相同的,而實際數據的存儲則有較大的差異。內部表的創建過程和數據加載過程這兩個過程可以分別獨立完成,也可以在同一個語句中完成,在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之后對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。而外部表只有一個過程,加載數據和創建表同時完成(CREATE EXTERNAL TABLE ……LOCATION),實際數據是存儲在LOCATION后面指定的 HDFS 路徑中,并不會移動到數據倉庫目錄中。當刪除一個External Table時,僅刪除該鏈接。
外部表簡單示例:
創建數據文件:test_external_table.txt 創建表:create external table test_external_table (key string) 加載數據:LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table 查看數據:select * from test_external_table; select count(*) from test_external_table 刪除表:drop table test_external_table3.4 分區
Partition對應于數據庫中的Partition列的密集索引,但是Hive中Partition的組織方式和數據庫中的很不相同。在Hive中,表中的一個Partition對應于表下的一個目錄,所有的Partition的數據都存儲在對應的目錄中。
例如pvs表中包含ds和city兩個Partition,則對應于ds = 20090801, ctry = US 的HDFS子目錄為/wh/pvs/ds=20090801/ctry=US;對應于 ds = 20090801, ctry = CA 的HDFS子目錄為/wh/pvs/ds=20090801/ctry=CA。
分區表簡單示例:
創建數據文件:test_partition_table.txt 創建表:create table test_partition_table (key string) partitioned by (dt string) 加載數據:LOAD DATA INPATH 'filepath' INTO TABLE test_partition_table partition (dt='2006') 查看數據:select * from test_partition_table; select count(*) from test_partition_table 刪除表:drop table test_partition_table3.5 桶
Buckets是將表的列通過Hash算法進一步分解成不同的文件存儲。它對指定列計算hash,根據hash值切分數據,目的是為了并行,每一個Bucket對應一個文件。
例如將user列分散至32個bucket,首先對user列的值計算hash,對應hash值為0的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00000;hash值為20的HDFS目錄為/wh/pvs/ds=20090801/ctry=US/part-00020。如果想應用很多的Map任務這樣是不錯的選擇。
桶的簡單示例:
創建數據文件:test_bucket_table.txt 創建表:create table test_bucket_table (key string) clustered by (key) into 20 buckets 加載數據:LOAD DATA INPATH 'filepath' INTO TABLE test_bucket_table 查看數據:select * from test_bucket_table; set hive.enforce.bucketing = true;3.6 Hive的視圖
視圖與傳統數據庫的視圖類似。視圖是只讀的,它基于的基本表,如果改變,數據增加不會影響視圖的呈現;如果刪除,會出現問題。
如果不指定視圖的列,會根據select語句后的生成。
示例:
總結
以上是生活随笔為你收集整理的Hive体系结构(一)架构与基本组成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HiveQL基本操作整理
- 下一篇: 15分钟了解Apache Phoenix