Hive基本原理
Hive結(jié)構(gòu)
Hive為單實(shí)例的服務(wù)進(jìn)程,提供服務(wù)的原理是將HQL編譯解析成相應(yīng)的MapReduce或者HDFS任務(wù)。
- 各模塊的功能說明如下:
HiveServer
一個(gè)集群內(nèi)可部署多個(gè)HiveServer,負(fù)荷分擔(dān)。對(duì)外提供Hive數(shù)據(jù)庫(kù)服務(wù),將用戶提交的HQL語(yǔ)句進(jìn)行編譯,解析成對(duì)應(yīng)的Yarn任務(wù)或者HDFS操作,從而完成數(shù)據(jù)的提取、轉(zhuǎn)換、分析。
MetaStore
一個(gè)集群內(nèi)可部署多個(gè)MetaStore,負(fù)荷分擔(dān)。提供Hive的元數(shù)據(jù)服務(wù),負(fù)責(zé)Hive表的結(jié)構(gòu)和屬性信息讀、寫、維護(hù)和修改。
提供Thrift接口,供HiveServer、Spark、WebHCat等MetaStore客戶端來(lái)訪問,操作元數(shù)據(jù)。
WebHCat
一個(gè)集群內(nèi)可部署多個(gè)WebHCat,負(fù)荷分擔(dān)。提供Rest接口,通過Rest執(zhí)行Hive命令,提交MapReduce任務(wù)。
Hive客戶端
包括人機(jī)交互命令行Beeline、提供給JDBC應(yīng)用的JDBC驅(qū)動(dòng)、提供給Python應(yīng)用的Python驅(qū)動(dòng)、提供給Mapreduce的HCatalog相關(guān)JAR包。
ZooKeeper集群
ZooKeeper作為臨時(shí)節(jié)點(diǎn)記錄各HiveServer實(shí)例的IP地址列表,客戶端驅(qū)動(dòng)連接Zookeeper獲取該列表,并根據(jù)路由機(jī)制選取對(duì)應(yīng)的HiveServer實(shí)例。
HDFS/HBase集群
Hive表數(shù)據(jù)存儲(chǔ)在HDFS集群中。
MapReduce/Yarn集群
提供分布式計(jì)算服務(wù):Hive的大部分?jǐn)?shù)據(jù)操作依賴MapReduce,HiveServer的主要功能是將HQL語(yǔ)句轉(zhuǎn)換成MapReduce任務(wù),從而完成對(duì)海量數(shù)據(jù)的處理。

Hive原理
Hive作為一個(gè)基于HDFS和MapReduce架構(gòu)的數(shù)據(jù)倉(cāng)庫(kù),其主要能力是通過對(duì)HQL(Hive Query Language)編譯和解析,生成并執(zhí)行相應(yīng)的MapReduce任務(wù)或者HDFS操作。
- 各模塊的功能說明如下:
Metastore
對(duì)表,列和Partition等的元數(shù)據(jù)進(jìn)行讀寫及更新操作,其下層為關(guān)系型數(shù)據(jù)庫(kù)。
Driver
管理HiveQL執(zhí)行的生命周期并貫穿Hive任務(wù)整個(gè)執(zhí)行期間。
Compiler
編譯HiveQL并將其轉(zhuǎn)化為一系列相互依賴的Map/Reduce任務(wù)。
Optimizer
優(yōu)化器,分為邏輯優(yōu)化器和物理優(yōu)化器,分別對(duì)HiveQL生成的執(zhí)行計(jì)劃和MapReduce任務(wù)進(jìn)行優(yōu)化。
Executor
按照任務(wù)的依賴關(guān)系分別執(zhí)行MapReduce任務(wù)。
ThriftServer
提供thrift接口,作為JDBC和ODBC的服務(wù)端,并將Hive和其他應(yīng)用程序集成起來(lái)。
Clients
包含WebUI和JDBC/ODBC接口,為用戶訪問提供接口。

Hive CBO原理介紹
CBO(Cost Based Optimization),即基于代價(jià)的優(yōu)化器。優(yōu)化目標(biāo)是:在編譯階段,根據(jù)查詢語(yǔ)句中涉及到的表和查詢條件,計(jì)算出產(chǎn)生中間結(jié)果少的高效join順序,從而減少查詢時(shí)間和資源消耗。
- Hive中實(shí)現(xiàn)CBO的總體過程如下:
Hive使用開源組件Apache Calcite實(shí)現(xiàn)CBO。首先SQL語(yǔ)句轉(zhuǎn)化成Hive的AST,然后轉(zhuǎn)成Calcite可以識(shí)別的RelNodes。Calcite將RelNode中的Join順序調(diào)整后,再由Hive將RelNode轉(zhuǎn)成AST,繼續(xù)Hive的邏輯優(yōu)化和物理優(yōu)化過程。
Calcite調(diào)整Join順序的具體過程如下:
1、針對(duì)所有參與Join的表,依次選取一個(gè)表作為第一張表。
2、依據(jù)選取的第一張表,根據(jù)代價(jià)選擇第二張表,第三張表。由此可以得到多個(gè)不同的執(zhí)行計(jì)劃。
3、計(jì)算出代價(jià)最小的一個(gè)計(jì)劃,作為最終的順序優(yōu)化結(jié)果。

Hive與其他組件的關(guān)系
-
Hive與HDFS組件的關(guān)系
Hive是Apache的Hadoop項(xiàng)目的子項(xiàng)目,Hive利用HDFS作為其文件存儲(chǔ)系統(tǒng)。Hive通過解析和計(jì)算處理結(jié)構(gòu)化的數(shù)據(jù),Hadoop HDFS則為Hive提供了高可靠性的底層存儲(chǔ)支持。Hive數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)文件都可以存儲(chǔ)在Hadoop HDFS文件系統(tǒng)上,Hive所有的數(shù)據(jù)操作也都是通過Hadoop HDFS接口進(jìn)行的。
Hive是Apache的Hadoop項(xiàng)目的子項(xiàng)目,Hive利用HDFS作為其文件存儲(chǔ)系統(tǒng)。Hive通過解析和計(jì)算處理結(jié)構(gòu)化的數(shù)據(jù),Hadoop HDFS則為Hive提供了高可靠性的底層存儲(chǔ)支持。Hive數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)文件都可以存儲(chǔ)在Hadoop HDFS文件系統(tǒng)上,Hive所有的數(shù)據(jù)操作也都是通過Hadoop HDFS接口進(jìn)行的。
-
Hive與MapReduce組件的關(guān)系
Hive的數(shù)據(jù)計(jì)算依賴于MapReduce。MapReduce也是Apache的Hadoop項(xiàng)目的子項(xiàng)目,它是一個(gè)基于Hadoop HDFS分布式并行計(jì)算框架。Hive進(jìn)行數(shù)據(jù)分析時(shí),會(huì)將用戶提交的HQL語(yǔ)句解析成相應(yīng)的MapReduce任務(wù)并提交MapReduce執(zhí)行。
Hive的數(shù)據(jù)計(jì)算依賴于MapReduce。MapReduce也是Apache的Hadoop項(xiàng)目的子項(xiàng)目,它是一個(gè)基于Hadoop HDFS分布式并行計(jì)算框架。Hive進(jìn)行數(shù)據(jù)分析時(shí),會(huì)將用戶提交的HQL語(yǔ)句解析成相應(yīng)的MapReduce任務(wù)并提交MapReduce執(zhí)行。
-
Hive與Tez的關(guān)系
Tez是Apache的開源項(xiàng)目,它是一個(gè)支持有向無(wú)環(huán)圖的分布式計(jì)算框架,Hive使用Tez引擎進(jìn)行數(shù)據(jù)分析時(shí),會(huì)將用戶提交的HQL語(yǔ)句解析成相應(yīng)的Tez任務(wù)并提交Tez執(zhí)行。
Tez是Apache的開源項(xiàng)目,它是一個(gè)支持有向無(wú)環(huán)圖的分布式計(jì)算框架,Hive使用Tez引擎進(jìn)行數(shù)據(jù)分析時(shí),會(huì)將用戶提交的HQL語(yǔ)句解析成相應(yīng)的Tez任務(wù)并提交Tez執(zhí)行。
-
Hive與DBService的關(guān)系
Hive的MetaStore(元數(shù)據(jù)服務(wù))處理Hive的數(shù)據(jù)庫(kù)、表、分區(qū)等的結(jié)構(gòu)和屬性信息(即Hive的元數(shù)據(jù)),這些信息需要存放在一個(gè)關(guān)系型數(shù)據(jù)庫(kù)中,由MetaStore管理和處理。在產(chǎn)品中,Hive的元數(shù)據(jù)由DBService組件存儲(chǔ)和維護(hù),由Metadata組件提供元數(shù)據(jù)服務(wù)。
Hive的MetaStore(元數(shù)據(jù)服務(wù))處理Hive的數(shù)據(jù)庫(kù)、表、分區(qū)等的結(jié)構(gòu)和屬性信息(即Hive的元數(shù)據(jù)),這些信息需要存放在一個(gè)關(guān)系型數(shù)據(jù)庫(kù)中,由MetaStore管理和處理。在產(chǎn)品中,Hive的元數(shù)據(jù)由DBService組件存儲(chǔ)和維護(hù),由Metadata組件提供元數(shù)據(jù)服務(wù)。
Hive開源增強(qiáng)特性
-
Hive開源增強(qiáng)特性:支持HDFS Colocation
HDFS Colocation(同分布)是HDFS提供的數(shù)據(jù)分布控制功能,利用HDFS Colocation接口,可以將存在關(guān)聯(lián)關(guān)系或者可能進(jìn)行關(guān)聯(lián)操作的數(shù)據(jù)存放在相同的存儲(chǔ)節(jié)點(diǎn)上。
Hive支持HDFS的Colocation功能,即在創(chuàng)建Hive表時(shí),通過設(shè)置表文件分布的locator信息,可以將相關(guān)表的數(shù)據(jù)文件存放在相同的存儲(chǔ)節(jié)點(diǎn)上,從而使后續(xù)的多表關(guān)聯(lián)的數(shù)據(jù)計(jì)算更加方便和高效。
HDFS Colocation(同分布)是HDFS提供的數(shù)據(jù)分布控制功能,利用HDFS Colocation接口,可以將存在關(guān)聯(lián)關(guān)系或者可能進(jìn)行關(guān)聯(lián)操作的數(shù)據(jù)存放在相同的存儲(chǔ)節(jié)點(diǎn)上。
Hive支持HDFS的Colocation功能,即在創(chuàng)建Hive表時(shí),通過設(shè)置表文件分布的locator信息,可以將相關(guān)表的數(shù)據(jù)文件存放在相同的存儲(chǔ)節(jié)點(diǎn)上,從而使后續(xù)的多表關(guān)聯(lián)的數(shù)據(jù)計(jì)算更加方便和高效。
-
Hive開源增強(qiáng)特性:支持列加密功能
Hive支持對(duì)表的某一列或者多列進(jìn)行加密。在創(chuàng)建Hive表時(shí),可以指定要加密的列和加密算法。當(dāng)使用insert語(yǔ)句向表中插入數(shù)據(jù)時(shí),即可將對(duì)應(yīng)的列進(jìn)行加密。Hive列加密不支持視圖以及Hive over HBase場(chǎng)景。
Hive列加密機(jī)制目前支持的加密算法有兩種,具體使用的算法在建表時(shí)指定。其中:
AES(對(duì)應(yīng)加密類名稱為:org.apache.hadoop.hive.serde2.AESRewriter)
SMS4(對(duì)應(yīng)加密類名稱為:org.apache.hadoop.hive.serde2.SMS4Rewriter)
Hive支持對(duì)表的某一列或者多列進(jìn)行加密。在創(chuàng)建Hive表時(shí),可以指定要加密的列和加密算法。當(dāng)使用insert語(yǔ)句向表中插入數(shù)據(jù)時(shí),即可將對(duì)應(yīng)的列進(jìn)行加密。Hive列加密不支持視圖以及Hive over HBase場(chǎng)景。
Hive列加密機(jī)制目前支持的加密算法有兩種,具體使用的算法在建表時(shí)指定。其中:
AES(對(duì)應(yīng)加密類名稱為:org.apache.hadoop.hive.serde2.AESRewriter)
SMS4(對(duì)應(yīng)加密類名稱為:org.apache.hadoop.hive.serde2.SMS4Rewriter)
-
Hive開源增強(qiáng)特性:支持行分隔符
通常情況下,Hive以文本文件存儲(chǔ)的表會(huì)以回車作為其行分隔符,即在查詢過程中,以回車符作為一行表數(shù)據(jù)的結(jié)束符。
但某些數(shù)據(jù)文件并不是以回車分隔的規(guī)則文本格式,而是以某些特殊符號(hào)分割其規(guī)則文本。
MRS Hive支持指定不同的字符或字符組合作為Hive文本數(shù)據(jù)的行分隔符。
通常情況下,Hive以文本文件存儲(chǔ)的表會(huì)以回車作為其行分隔符,即在查詢過程中,以回車符作為一行表數(shù)據(jù)的結(jié)束符。
但某些數(shù)據(jù)文件并不是以回車分隔的規(guī)則文本格式,而是以某些特殊符號(hào)分割其規(guī)則文本。
MRS Hive支持指定不同的字符或字符組合作為Hive文本數(shù)據(jù)的行分隔符。
-
Hive開源增強(qiáng)特性:支持HBase刪除功能
由于底層存儲(chǔ)系統(tǒng)的原因,Hive并不能支持對(duì)單條表數(shù)據(jù)進(jìn)行刪除操作,但在Hive on HBase功能中,MRS解決方案中的Hive提供了對(duì)HBase表的單條數(shù)據(jù)的刪除功能,通過特定的語(yǔ)法,Hive可以將自己在HBase表中符合條件的一條或者多條數(shù)據(jù)清除。
由于底層存儲(chǔ)系統(tǒng)的原因,Hive并不能支持對(duì)單條表數(shù)據(jù)進(jìn)行刪除操作,但在Hive on HBase功能中,MRS解決方案中的Hive提供了對(duì)HBase表的單條數(shù)據(jù)的刪除功能,通過特定的語(yǔ)法,Hive可以將自己在HBase表中符合條件的一條或者多條數(shù)據(jù)清除。
-
Hive開源增強(qiáng)特性:支持?jǐn)?shù)據(jù)庫(kù)授權(quán)
Hive開源社區(qū)版本只支持?jǐn)?shù)據(jù)庫(kù)的擁有者在數(shù)據(jù)庫(kù)中創(chuàng)建表。MRS Hive支持授予用戶在數(shù)據(jù)庫(kù)中創(chuàng)建表“CREATE”和查詢表“SELECT”權(quán)限。當(dāng)授予用戶在數(shù)據(jù)庫(kù)中查詢的權(quán)限之后,系統(tǒng)會(huì)自動(dòng)關(guān)聯(lián)數(shù)據(jù)庫(kù)中所有表的查詢權(quán)限。
Hive開源社區(qū)版本只支持?jǐn)?shù)據(jù)庫(kù)的擁有者在數(shù)據(jù)庫(kù)中創(chuàng)建表。MRS Hive支持授予用戶在數(shù)據(jù)庫(kù)中創(chuàng)建表“CREATE”和查詢表“SELECT”權(quán)限。當(dāng)授予用戶在數(shù)據(jù)庫(kù)中查詢的權(quán)限之后,系統(tǒng)會(huì)自動(dòng)關(guān)聯(lián)數(shù)據(jù)庫(kù)中所有表的查詢權(quán)限。
-
Hive開源增強(qiáng)特性:支持列授權(quán)
Hive開源社區(qū)版本只支持表級(jí)別的權(quán)限控制。MRS Hive支持列級(jí)別的權(quán)限控制,可授予用戶列級(jí)別權(quán)限,例如查詢“SELECT”、插入“INSERT”、修改“UPDATE”權(quán)限。
Hive開源社區(qū)版本只支持表級(jí)別的權(quán)限控制。MRS Hive支持列級(jí)別的權(quán)限控制,可授予用戶列級(jí)別權(quán)限,例如查詢“SELECT”、插入“INSERT”、修改“UPDATE”權(quán)限。