10 Hive體系架構(gòu)
成都創(chuàng)新互聯(lián)公司是少有的網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、營銷型企業(yè)網(wǎng)站、小程序開發(fā)、手機APP,開發(fā)、制作、設(shè)計、買友情鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,從2013年成立,堅持透明化,價格低,無套路經(jīng)營理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評
10.1 概念
用戶接口:用戶訪問Hive的入口
元數(shù)據(jù):Hive的用戶信息與表的MetaData
解釋器:分析翻譯HQL的組件
編譯器:編譯HQL的組件
優(yōu)化器:優(yōu)化HQL的組件
10.2 Hive架構(gòu)與基本組成
1、架構(gòu)圖
2、基本組成
用戶接口,包括 CLI,JDBC/ODBC,WebUI
元數(shù)據(jù)存儲,通常是存儲在關(guān)系數(shù)據(jù)庫如 MySQL, derby 中
解釋器、編譯器、優(yōu)化器、執(zhí)行器
Hadoop:用HDFS 進行存儲,利用 MapReduce 進行計算
3、各組件的基本功能
用戶接口主要有三個:CLI,JDBC/ODBC和 WebUI
CLI,即Shell命令行
JDBC/ODBC 是Hive 的JAVA,與使用傳統(tǒng)數(shù)據(jù)庫JDBC的方式類似
WebGUI是通過瀏覽器訪問 Hive
Hive 將元數(shù)據(jù)存儲在數(shù)據(jù)庫中,目前只支持 mysql、derby,下一版本會支持更多的數(shù)據(jù)庫。Hive 中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等
解釋器、編譯器、優(yōu)化器完成 HQL 查詢語句從詞法分析、語法分析、編譯、優(yōu)化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,并在隨后有 MapReduce 調(diào)用執(zhí)行
Hive 的數(shù)據(jù)存儲在HDFS 中,大部分的查詢由 MapReduce 完成(包含* 的查詢,比如 select * from table 不會生成 MapRedcue 任務(wù))
4、Metastore
Metastore是系統(tǒng)目錄(catalog)用于保存Hive中所存儲的表的元數(shù)據(jù)(metadata)信息
Metastore是Hive被用作傳統(tǒng)數(shù)據(jù)庫解決方案(如oracle和db2)時區(qū)別其它類似系統(tǒng)的一個特征
Metastore包含如下的部分:
Database 是表(table)的名字空間。默認的數(shù)據(jù)庫(database)名為‘default’
Table 表(table)的原數(shù)據(jù)包含信息有:列(list of columns)和它們的類型(types),擁有者(owner),存儲空間(storage)和SerDei信息
Partition 每個分區(qū)(partition)都有自己的列(columns),SerDe和存儲空間(storage)。這一特征將被用來支持Hive中的模式演變(schema evolution)
5、Compiler
Driver調(diào)用編譯器(compiler)處理HiveQL字串,這些字串可能是一條DDL、DML或查詢語句
編譯器將字符串轉(zhuǎn)化為策略(plan)
策略僅由元數(shù)據(jù)操作和HDFS操作組成,元數(shù)據(jù)操作只包含DDL語句,HDFS操作只包含LOAD語句
對插入和查詢而言,策略由map-reduce任務(wù)中的具有方向的非循環(huán)圖(directedacyclic graph,DAG)組成
10.3 Hive運行模式
Hive的運行模式即任務(wù)的執(zhí)行環(huán)境
分為本地與集群兩種
我們可以通過mapred.job.tracker 來指明
設(shè)置方式:hive > SET mapred.job.tracker=local
10.4 數(shù)據(jù)類型
1、原始數(shù)據(jù)類型
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 charactersin a specified character set
2、復(fù)雜數(shù)據(jù)類型
Structs: 例子 {c INT; d INT}
Maps (key-value tuples):. 例子'group' ->gid M['group']
Arrays (indexable lists): 例子[‘1', ‘2', ‘3']
TIMESTAMP 0.8版本新加屬性
10.5 Hive的元數(shù)據(jù)存儲
1、存儲方式與模式
Hive將元數(shù)據(jù)存儲在數(shù)據(jù)庫中
連接到數(shù)據(jù)庫模式有三種
單用戶模式
多用戶模式
遠程服務(wù)器模式
2、單用戶模式
此模式連接到一個 In-memory 的數(shù)據(jù)庫 Derby ,一般用于 Unit Test
3、多用戶模式
通過網(wǎng)絡(luò)連接到一個數(shù)據(jù)庫中,是最經(jīng)常使用到的模式
4、遠程服務(wù)器模式
用于非 Java 客戶端訪問元數(shù)據(jù)庫,在服務(wù)器端啟動MetaStoreServer,客戶端利用 Thrift 協(xié)議通過MetaStoreServer 訪問元數(shù)據(jù)庫。
10.6 Hive的數(shù)據(jù)存儲
1、Hive數(shù)據(jù)存儲的基本概念
Hive的數(shù)據(jù)存儲是建立在Hadoop HDFS之上的
Hive沒有專門的數(shù)據(jù)存儲格式
存儲結(jié)構(gòu)主要包括:數(shù)據(jù)庫、文件、表、視圖
Hive默認可以直接加載文本文件,還支持sequence file 、RCFile
創(chuàng)建表時,我們直接告訴Hive數(shù)據(jù)的列分隔符與行分隔符,Hive即可解析數(shù)據(jù)
2、Hive的數(shù)據(jù)模型-數(shù)據(jù)庫
類似傳統(tǒng)數(shù)據(jù)庫的DataBase
在第三方數(shù)據(jù)庫里實際是一張表
簡單示例:命令行hive > create database test_database;
3、內(nèi)部表
與數(shù)據(jù)庫中的 Table 在概念上是類似
每一個 Table 在 Hive 中都有一個相應(yīng)的目錄存儲數(shù)據(jù)
例如,一個表 test,它在 HDFS 中的路徑為:/warehouse /test
warehouse是在 hive-site.xml 中由
${hive.metastore.warehouse.dir}指定的數(shù)據(jù)倉庫的目錄
所有的 Table 數(shù)據(jù)(不包括 External Table)都保存在這個目錄中。
刪除表時,元數(shù)據(jù)與數(shù)據(jù)都會被刪除
4、內(nèi)部表簡單示例
創(chuàng)建數(shù)據(jù)文件test_inner_table.txt
創(chuàng)建表
create table test_inner_table (key string)
加載數(shù)據(jù)
LOAD DATA LOCAL INPATH ‘filepath’ INTO TABLE test_inner_table
查看數(shù)據(jù)
select * from test_inner_table select count(*) from test_inner_table
刪除表
drop table test_inner_table
5、分區(qū)表
Partition 對應(yīng)于數(shù)據(jù)庫中的 Partition 列的密集索引
在 Hive 中,表中的一個 Partition 對應(yīng)于表下的一個目錄,所有的 Partition 的數(shù)據(jù)都存儲在對應(yīng)的目錄中
例如:test表中包含 date 和position 兩個 Partition,則對應(yīng)于 date= 20120801, position = zh 的 HDFS 子目錄為:/ warehouse /test/date=20120801/ position =zh
對應(yīng)于 = 20100801, position = US 的HDFS 子目錄為;/ warehouse/xiaojun/date=20120801/ position =US
6、分區(qū)表簡單示例
創(chuàng)建數(shù)據(jù)文件test_partition_table.txt
創(chuàng)建表
create table test_partition_table (key string) partitioned by (dtstring)
加載數(shù)據(jù)
LOAD DATA INPATH ‘filepath’ INTO TABLE test_partition_tablepartition (dt=‘2006’)
查看數(shù)據(jù)
select * from test_partition_table select count(*) from test_partition_table
刪除表
drop table test_partition_table
7、外部表
指向已經(jīng)在 HDFS 中存在的數(shù)據(jù),可以創(chuàng)建 Partition
它和 內(nèi)部表 在元數(shù)據(jù)的組織上是相同的,而實際數(shù)據(jù)的存儲則有較大的差異
內(nèi)部表 的創(chuàng)建過程和數(shù)據(jù)加載過程(這兩個過程可以在同一個語句中完成),在加載數(shù)據(jù)的過程中,實際數(shù)據(jù)會被移動到數(shù)據(jù)倉庫目錄中;之后對數(shù)據(jù)對訪問將會直接在數(shù)據(jù)倉庫目錄中完成。刪除表時,表中的數(shù)據(jù)和元數(shù)據(jù)將會被同時刪除
外部表 只有一個過程,加載數(shù)據(jù)和創(chuàng)建表同時完成,并不會移動到數(shù)據(jù)倉庫目錄中,只是與外部數(shù)據(jù)建立一個鏈接。當刪除一個外部表 時,僅刪除該鏈接
8、外部表簡單示例
創(chuàng)建數(shù)據(jù)文件test_external_table.txt
創(chuàng)建表
create external table test_external_table (key string)
加載數(shù)據(jù)
LOAD DATA INPATH ‘filepath’ INTO TABLE test_inner_table
查看數(shù)據(jù)
select * from test_external_table select count(*) from test_external_table
刪除表
drop table test_external_table
9、Bucket Table(桶表)
可以將表的列通過Hash算法進一步分解成不同的文件存儲
例如:將age列分散成20個文件,首先要對AGE進行Hash計算,對應(yīng)為0的寫入/warehouse/test/date=20120801/postion=zh/part-00000,對應(yīng)為1的寫入/warehouse/test/date=20120801/postion=zh/part-00001
如果想應(yīng)用很多的Map任務(wù)這樣是不錯的選擇
10、Bucket Table簡單示例
創(chuàng)建數(shù)據(jù)文件test_bucket_table.txt
創(chuàng)建表
create table test_bucket_table (key string) clustered by (key)into 20 buckets
加載數(shù)據(jù)
LOAD DATA INPATH ‘filepath’ INTO TABLE test_bucket_table
查看數(shù)據(jù)
select * from test_bucket_table set hive.enforce.bucketing = true;
11、Hive的數(shù)據(jù)模型-視圖
視圖與傳統(tǒng)數(shù)據(jù)庫的視圖類似
視圖是只讀的
視圖基于的基本表,如果改變,指增加不會影響視圖的呈現(xiàn);如果刪除,會出現(xiàn)問題
如果不指定視圖的列,會根據(jù)select語句后的生成
示例
create view test_view as select * from test
10.7 Hive的數(shù)據(jù)存儲
配置步驟:
hive-site.xml 添加
hive.hwi.war.file lib/hive-hwi-0.8.1.war
啟動Hive的UI sh $HIVE_HOME/bin/hive --service hwi
11 Hive原理
11.1 Hive原理
1、什么要學(xué)習(xí)Hive的原理
一條Hive HQL將轉(zhuǎn)換為多少道MR作業(yè)
怎么樣加快Hive的執(zhí)行速度
編寫Hive HQL的時候我們可以做什么
Hive 怎么將HQL轉(zhuǎn)換為MR作業(yè)
Hive會采用什么樣的優(yōu)化方式
2、Hive架構(gòu)&執(zhí)行流程圖
3、Hive執(zhí)行流程
編譯器將一個Hive QL轉(zhuǎn)換操作符
操作符是Hive的最小的處理單元
每個操作符代表HDFS的一個操作或者一道MapReduce作業(yè)
4、Operator
Operator都是hive定義的一個處理過程
Operator都定義有:
protected List
protected List
protected boolean done; // 初始化值為false
所有的操作構(gòu)成了 Operator圖,hive正是基于這些圖關(guān)系來處理諸如limit, group by, join等操作。
5、Hive執(zhí)行流程
操作符 | 描述 |
TableScanOperator | 掃描hive表數(shù)據(jù) |
ReduceSinkOperator | 創(chuàng)建將發(fā)送到Reducer端的 |
JoinOperator | Join兩份數(shù)據(jù) |
SelectOperator | 選擇輸出列 |
FileSinkOperator | 建立結(jié)果數(shù)據(jù),輸出至文件 |
FilterOperator | 過濾輸入數(shù)據(jù) |
GroupByOperator | GroupBy語句 |
MapJoinOperator | /*+mapjoin(t) */ |
LimitOperator | Limit語句 |
UnionOperator | Union語句 |
Hive通過ExecMapper和ExecReducer執(zhí)行MapReduce任務(wù)
在執(zhí)行MapReduce時有兩種模式
本地模式
分布式模式
6、ANTLR詞法語法分析工具
ANTLR—Another Tool for Language Recognition
ANTLR 是開源的
為包括Java,C++,C#在內(nèi)的語言提供了一個通過語法描述來自動構(gòu)造自定義語言的識別器(recognizer),編譯器(parser)和解釋器(translator)的框架
Hibernate就是使用了該分析工具
11.2 一條HQL引發(fā)的思考
1、案例HQL
select key from test_limit limit 1
Stage-1
TableScan Operator>Select Operator-> Limit->File OutputOperator
Stage-0
Fetch Operator
讀取文件
2、Mapper與InputFormat
該hive MR作業(yè)中指定的mapper是:
mapred.mapper.class = org.apache.hadoop.hive.ql.exec.ExecMapper
input format是:
hive.input.format =
org.apache.hadoop.hive.ql.io.CombineHiveInputFormat
該hive MR作業(yè)中指定的mapper是:
mapred.mapper.class = org.apache.hadoop.hive.ql.exec.ExecMapper
input format是:
hive.input.format =
org.apache.hadoop.hive.ql.io.CombineHiveInputFormat