您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Hive體系結構是怎么樣的的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
第一部分:概念
概念
?用戶接口:用戶訪問Hive的入口
?元數據:Hive的用戶信息與表的MetaData
?解釋器:分析翻譯HQL的組件
?編譯器:編譯HQL的組件
?優化器:優化HQL的組件
第二部分:Hive架構與基本組成
架構圖
基本組成
?用戶接口,包括 CLI,JDBC/ODBC,WebUI
?元數據存儲,通常是存儲在關系數據庫如 mysql, derby 中
?解釋器、編譯器、優化器、執行器
?Hadoop:用 HDFS 進行存儲,利用 MapReduce 進行計算
各組件的基本功能
?用戶接口主要有三個:CLI,JDBC/ODBC和 WebUI
?CLI,即Shell命令行
?JDBC/ODBC 是 Hive 的JAVA,與使用傳統數據庫JDBC的方式類似
?WebGUI是通過瀏覽器訪問 Hive
?Hive 將元數據存儲在數據庫中,目前只支持 mysql、derby,下一版本會支持更多的數據庫。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等
?解釋器、編譯器、優化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,并在隨后有 MapReduce 調用執行
?Hive 的數據存儲在 HDFS 中,大部分的查詢由 MapReduce 完成(包含 * 的查詢,比如 select * from table 不會生成 MapRedcue 任務)
Metastore
?Metastore是系統目錄(catalog)用于保存Hive中所存儲的表的元數據(metadata)信息
?Metastore是Hive被用作傳統數據庫解決方案(如oracle和db2)時區別其它類似系統的一個特征
?Metastore包含如下的部分:
?Database 是表(table)的名字空間。默認的數據庫(database)名為‘default’
?Table 表(table)的原數據包含信息有:列(list of columns)和它們的類型(types),擁有者(owner),存儲空間(storage)和SerDei信息
?Partition 每個分區(partition)都有自己的列(columns),SerDe和存儲空間(storage)。這一特征將被用來支持Hive中的模式演變(schema evolution)
Compiler
?Driver調用編譯器(compiler)處理HiveQL字串,這些字串可能是一條DDL、DML或查詢語句
?編譯器將字符串轉化為策略(plan)
?策略僅由元數據操作和HDFS操作組成,元數據操作只包含DDL語句,HDFS操作只包含LOAD語句
?對插入和查詢而言,策略由map-reduce任務中的具有方向的非循環圖(directedacyclic graph,DAG)組成
第三部分:Hive運行模式
Hive運行模式
?Hive的運行模式即任務的執行環境
?分為本地與集群兩種
?我們可以通過mapred.job.tracker 來指明
?設置方式
?hive > SET mapred.job.tracker=local
第四部分:數據類型
原始數據類型
?Integers
TINYINT - 1 byte
SMALLINT - 2 byte
INT - 4 byte
BIGINT - 8 byte
?Boolean type
BOOLEAN - TRUE/FALSE
?Floating point numbers
FLOAT –單精度
DOUBLE – 雙精度
?String type
STRING - sequence of characters in a specified character set
復雜數據類型
?Structs: 例子 {c INT; d INT}
?Maps (key-value tuples):. 例子'group' -> gid M['group']
?Arrays (indexable lists): 例子[‘1', ‘2', ‘3']
?TIMESTAMP 0.8版本新加屬性
第五部分:Hive的元數據存儲
存儲方式與模式
?Hive 將元數據存儲在 數據庫中
?連接到數據庫模式有三種
?單用戶模式
?多用戶模式
?遠程服務器模式
單用戶模式
此模式連接到一個 In-memory 的數據庫 Derby ,一般用于 Unit Test
多用戶模式
通過網絡連接到一個數據庫中,是最經常使用到的模式
遠程服務器模式
?用于非 Java 客戶端訪問元數據庫,在服務器端啟動MetaStoreServer,客戶端利用 Thrift 協議通過MetaStoreServer 訪問元數據庫
第六部分:Hive的數據存儲
Hive數據存儲的基本概念
?Hive的數據存儲是建立在Hadoop HDFS之上的
?Hive沒有專門的數據存儲格式
?存儲結構主要包括:數據庫、文件、表、視圖
?Hive默認可以直接加載文本文件,還支持sequence file 、RCFile
?創建表時,我們直接告訴Hive數據的列分隔符與行分隔符,Hive即可解析數據
Hive的數據模型-數據庫
?類似傳統數據庫的DataBase
?在第三方數據庫里實際是一張表
?簡單示例
?命令行hive > create database test_database;
Hive的數據模型-表
?Table 內部表
?Partition 分區表
?External Table 外部表
?Bucket Table
內部表
?與數據庫中的 Table 在概念上是類似
?每一個 Table 在 Hive 中都有一個相應的目錄存儲數據
?例如,一個表 test,它在 HDFS 中的路徑為:/ warehouse /test
? warehouse是在 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_table
分區表
?Partition 對應于數據庫中的 Partition 列的密集索引
?在 Hive 中,表中的一個 Partition 對應于表下的一個目錄,所有的 Partition 的數據都存儲在對應的目錄中
?例如:test表中包含 date 和 position 兩個 Partition,則對應于 date = 20120801, position = zh 的 HDFS 子目錄為:/ warehouse /test/date=20120801/ position =zh
?對應于 = 20100801, position = US 的HDFS 子目錄為;/ warehouse /xiaojun/date=20120801/ position =US
分區表簡單示例
?創建數據文件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_table
外部表
?指向已經在 HDFS 中存在的數據,可以創建 Partition
?它和 內部表 在元數據的組織上是相同的,而實際數據的存儲則有較大的差異
?內部表 的創建過程和數據加載過程(這兩個過程可以在同一個語句中完成),在加載數據的過程中,實際數據會被移動到數據倉庫目錄中;之后對數據對訪問將會直接在數據倉庫目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除
? 外部表 只有一個過程,加載數據和創建表同時完成,并不會移動到數據倉庫目錄中,只是與外部數據建立一個鏈接。當刪除一個 外部表 時,僅刪除該鏈接
外部表簡單示例
?創建數據文件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_table
Bucket Table
?可以將表的列通過Hash算法進一步分解成不同的文件存儲
?例如:將age列分散成20個文件,首先要對AGE進行Hash計算,對應為0的寫入/warehouse/test/date=20120801/postion=zh/part-00000,對應為1的寫入/warehouse/test/date=20120801/postion=zh/part-00001
?如果想應用很多的Map任務這樣是不錯的選擇
Bucket Table簡單示例
?創建數據文件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;
Hive的數據模型-視圖
?視圖與傳統數據庫的視圖類似
?視圖是只讀的
?視圖基于的基本表,如果改變,指增加不會影響視圖的呈現;如果刪除,會出現問題
?如果不指定視圖的列,會根據select語句后的生成
?示例
?create view test_view as select * from test
第七部分:HiveUI介紹
啟動UI
?配置
?hive-site.xml 添加
<property>
<name>hive.hwi.war.file</name>
<value>lib/hive-hwi-0.8.1.war</value>
</property>
?
?啟動Hive的UI sh $HIVE_HOME/bin/hive --service hwi
感謝各位的閱讀!關于“Hive體系結構是怎么樣的”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。