Hive体系结构(二)Hive的执行原理、与关系型数据库的比较
Hive體系結(jié)構(gòu)(一)架構(gòu)與基本組成
Hive體系結(jié)構(gòu)(二)Hive的執(zhí)行原理、與關(guān)系型數(shù)據(jù)庫的比較
Hive體系結(jié)構(gòu)(三)元數(shù)據(jù)庫與基本操作
Hive體系結(jié)構(gòu)(四)注意事項(xiàng)與擴(kuò)展特性
1. Hive執(zhí)行原理
Hive構(gòu)建在Hadoop之上,
1. HQL中對(duì)查詢語句的解釋、優(yōu)化、生成查詢計(jì)劃是由Hive完成的
2. 所有的數(shù)據(jù)都是存儲(chǔ)在Hadoop中
3. 查詢計(jì)劃被轉(zhuǎn)化為MapReduce任務(wù),在Hadoop中執(zhí)行(有些查詢沒有MR任務(wù),如:select * from table)
4. Hadoop和Hive都是用UTF-8編碼的
Hive編譯器將一個(gè)Hive QL轉(zhuǎn)換操作符。操作符Operator是Hive的最小的處理單元,每個(gè)操作符代表HDFS的一個(gè)操作或者一道MapReduce作業(yè)。Operator都是hive定義的一個(gè)處理過程,其定義有:
protected List <Operator<? extends Serializable >> childOperators; protected List <Operator<? extends Serializable >> parentOperators; protected boolean done; // 初始化值為false所有的操作構(gòu)成了Operator圖,hive正是基于這些圖關(guān)系來處理諸如limit, group by, join等操作。
操作符如下:
TableScanOperator:掃描hive表數(shù)據(jù)ReduceSinkOperator:創(chuàng)建將發(fā)送到Reducer端的<Key,Value>對(duì)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時(shí)有兩種模式,即本地模式和分布式模式 。
Hive編譯器的組成:
編譯流程如下:
2. Hive和數(shù)據(jù)庫異同
由于Hive采用了SQL的查詢語言HQL,因此很容易將Hive理解為數(shù)據(jù)庫。其實(shí)從結(jié)構(gòu)上來看,Hive和數(shù)據(jù)庫除了擁有類似的查詢語言,再無類似之處。數(shù)據(jù)庫可以用在Online的應(yīng)用中,但是Hive是為數(shù)據(jù)倉庫而設(shè)計(jì)的,清楚這一點(diǎn),有助于從應(yīng)用角度理解Hive的特性。
Hive和數(shù)據(jù)庫的比較如下表:
| 查詢語言 | HQL |
| 數(shù)據(jù)存儲(chǔ) | HDFS |
| 數(shù)據(jù)格式 | 用戶定義 |
| 數(shù)據(jù)更新 | 不支持 |
| 索引 | 無 |
| 執(zhí)行 | MapReduce |
| 執(zhí)行延遲 | 高 |
| 處理數(shù)據(jù)規(guī)模 | 大 |
| 可擴(kuò)展性 | 高 |
1. 查詢語言。由于 SQL 被廣泛的應(yīng)用在數(shù)據(jù)倉庫中,因此專門針對(duì)Hive的特性設(shè)計(jì)了類SQL的查詢語言HQL。熟悉SQL開發(fā)的開發(fā)者可以很方便的使用Hive進(jìn)行開發(fā)。
2. 數(shù)據(jù)存儲(chǔ)位置。Hive是建立在Hadoop之上的,所有Hive的數(shù)據(jù)都是存儲(chǔ)在HDFS中的。而數(shù)據(jù)庫則可以將數(shù)據(jù)保存在塊設(shè)備或者本地文件系統(tǒng)中。
3. 數(shù)據(jù)格式。Hive中沒有定義專門的數(shù)據(jù)格式,數(shù)據(jù)格式可以由用戶指定,用戶定義數(shù)據(jù)格式需要指定三個(gè)屬性:列分隔符(通常為空格、”\t”、”\x001″)、行分隔符(”\n”)以及讀取文件數(shù)據(jù)的方法(Hive中默認(rèn)有三個(gè)文件格式TextFile,SequenceFile以及RCFile)。由于在加載數(shù)據(jù)的過程中,不需要從用戶數(shù)據(jù)格式到Hive定義的數(shù)據(jù)格式的轉(zhuǎn)換,因此,
Hive在加載的過程中不會(huì)對(duì)數(shù)據(jù)本身進(jìn)行任何修改,而只是將數(shù)據(jù)內(nèi)容復(fù)制或者移動(dòng)到相應(yīng)的HDFS目錄中。
而在數(shù)據(jù)庫中,不同的數(shù)據(jù)庫有不同的存儲(chǔ)引擎,定義了自己的數(shù)據(jù)格式。所有數(shù)據(jù)都會(huì)按照一定的組織存儲(chǔ),因此,數(shù)據(jù)庫加載數(shù)據(jù)的過程會(huì)比較耗時(shí)。
4. 數(shù)據(jù)更新。由于Hive是針對(duì)數(shù)據(jù)倉庫應(yīng)用設(shè)計(jì)的,而數(shù)據(jù)倉庫的內(nèi)容是讀多寫少的。因此,Hive中不支持對(duì)數(shù)據(jù)的改寫和添加,所有的數(shù)據(jù)都是在加載的時(shí)候中確定好的。而數(shù)據(jù)庫中的數(shù)據(jù)通常是需要經(jīng)常進(jìn)行修改的,因此可以使用INSERT INTO … VALUES添加數(shù)據(jù),使用UPDATE … SET修改數(shù)據(jù)。
5. 索引。之前已經(jīng)說過,Hive在加載數(shù)據(jù)的過程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何處理,甚至不會(huì)對(duì)數(shù)據(jù)進(jìn)行掃描,因此也沒有對(duì)數(shù)據(jù)中的某些Key建立索引。Hive要訪問數(shù)據(jù)中滿足條件的特定值時(shí),需要暴力掃描整個(gè)數(shù)據(jù),因此訪問延遲較高。由于MapReduce的引入, Hive可以并行訪問數(shù)據(jù),因此即使沒有索引,對(duì)于大數(shù)據(jù)量的訪問,Hive仍然可以體現(xiàn)出優(yōu)勢(shì)。數(shù)據(jù)庫中,通常會(huì)針對(duì)一個(gè)或者幾個(gè)列建立索引,因此對(duì)于少量的特定條件的數(shù)據(jù)的訪問,數(shù)據(jù)庫可以有很高的效率,較低的延遲。由于數(shù)據(jù)的訪問延遲較高,決定了Hive不適合在線數(shù)據(jù)查詢。
6. 執(zhí)行。Hive中大多數(shù)查詢的執(zhí)行是通過Hadoop提供的MapReduce來實(shí)現(xiàn)的(類似select * from tbl的查詢不需要MapReduce)。而數(shù)據(jù)庫通常有自己的執(zhí)行引擎。
7. 執(zhí)行延遲。之前提到,Hive在查詢數(shù)據(jù)的時(shí)候,由于沒有索引,需要掃描整個(gè)表,因此延遲較高。另外一個(gè)導(dǎo)致Hive執(zhí)行延遲高的因素是MapReduce框架。由于MapReduce本身具有較高的延遲,因此在利用MapReduce執(zhí)行Hive查詢時(shí),也會(huì)有較高的延遲。相對(duì)的,數(shù)據(jù)庫的執(zhí)行延遲較低。當(dāng)然,這個(gè)低是有條件的,即數(shù)據(jù)規(guī)模較小,當(dāng)數(shù)據(jù)規(guī)模大到超過數(shù)據(jù)庫的處理能力的時(shí)候,Hive的并行計(jì)算顯然能體現(xiàn)出優(yōu)勢(shì)。
8. 可擴(kuò)展性。由于Hive是建立在Hadoop之上的,因此Hive的可擴(kuò)展性是和Hadoop的可擴(kuò)展性是一致的(世界上最大的Hadoop集群在Yahoo!,2009年的規(guī)模在4000臺(tái)節(jié)點(diǎn)左右)。而數(shù)據(jù)庫由于ACID語義的嚴(yán)格限制,擴(kuò)展行非常有限。目前最先進(jìn)的并行數(shù)據(jù)庫Oracle在理論上的擴(kuò)展能力也只有100臺(tái)左右。
9. 數(shù)據(jù)規(guī)模。由于Hive建立在集群上并可以利用MapReduce進(jìn)行并行計(jì)算,因此可以支持很大規(guī)模的數(shù)據(jù);對(duì)應(yīng)的,數(shù)據(jù)庫可以支持的數(shù)據(jù)規(guī)模較小。
總結(jié)
以上是生活随笔為你收集整理的Hive体系结构(二)Hive的执行原理、与关系型数据库的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 15分钟了解Apache Phoenix
- 下一篇: Hive体系结构(三)元数据库与基本操作