如下圖所示,從邏輯上來(lái)看,Hive包含了3大部分。
創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的安遠(yuǎn)網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
- Hive Clients
- Hive Services
- Hive Storage and Computing
用戶操作Hive的接口主要有三個(gè):CLI,Client 和 WUI。
其中最常用的是CLI,Cli啟動(dòng)的時(shí)候,會(huì)同時(shí)啟動(dòng)一個(gè)Hive副本。
Client是Hive的客戶端,用戶連接至Hive Server。在啟動(dòng) Client模式的時(shí)候,需要指出Hive Server所在節(jié)點(diǎn),并且在該節(jié)點(diǎn)啟動(dòng)Hive Server。而客戶端則又可以分為三種Thrift Client,JDBC Client,ODBC Client。
Web Interface是通過(guò)瀏覽器訪問(wèn)Hive。
- Hive將元數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中,如MySQL、derby。Hive中的元數(shù)據(jù)包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數(shù)據(jù)所在目錄等。
- 解釋器、編譯器、優(yōu)化器完成HQL查詢語(yǔ)句從詞法分析、語(yǔ)法分析、編譯、優(yōu)化以及查詢計(jì)劃的生成。生成的查詢計(jì)劃存儲(chǔ)在HDFS中,并在隨后由MapReduce調(diào)用執(zhí)行。
- Hive的數(shù)據(jù)存儲(chǔ)在HDFS中,大部分的查詢、計(jì)算由MapReduce完成(注意,包含的查詢,比如select from tbl不會(huì)生成MapRedcue任務(wù))。
上圖中的Driver會(huì)處理從應(yīng)用到metastore到filed system的所有請(qǐng)求,以進(jìn)行后續(xù)操作。
Hive組件
Driver
實(shí)現(xiàn)了session handler,在JDBC/ODBC接口上實(shí)現(xiàn)了執(zhí)行和獲取信息的API。
Compiler
該組件用于對(duì)不同的查詢表達(dá)式做解析查詢,語(yǔ)義分析,最終會(huì)根據(jù)從metastore中查詢到的表和分區(qū)元數(shù)據(jù)生成一個(gè)execution plain。
Execution Egine
該組件會(huì)執(zhí)行由compiler創(chuàng)建的execution。其中plan從數(shù)據(jù)結(jié)構(gòu)上來(lái)看,是一個(gè)DAG,該組件會(huì)管理plan的不同stage與組件中執(zhí)行這些plan之間的依賴。
Metastore
Hive的metastore組件是hive元數(shù)據(jù)集中存放地。該組件存儲(chǔ)了包括變量表中列和列類型等結(jié)構(gòu)化的信息以及數(shù)據(jù)倉(cāng)庫(kù)中的分區(qū)信息(包括列和列類型信息,讀寫數(shù)據(jù)時(shí)必要的序列化和反序列化信息,數(shù)據(jù)被存儲(chǔ)在HDFS文件中的位置)。
Metastore組件包括兩個(gè)部分:metastore services和Meta storage database。
- Metastore database的介質(zhì)就是關(guān)系數(shù)據(jù)庫(kù),例如hive默認(rèn)的嵌入式磁盤數(shù)據(jù)庫(kù)derby,還有mysql數(shù)據(jù)庫(kù)。
- Metastore services是建立在后臺(tái)數(shù)據(jù)存儲(chǔ)介質(zhì)(HDFS)之上,并且可以和hive services進(jìn)行交互的服務(wù)組件。
默認(rèn)情況下,metastore services和hive services是安裝在一起的,運(yùn)行在同一個(gè)進(jìn)程當(dāng)中。也可以把metastore services從hive services里剝離出來(lái),將metastore獨(dú)立安裝在一個(gè)集群里,hive遠(yuǎn)程調(diào)用metastore services。這樣我們可以把元數(shù)據(jù)這一層放到防火墻之后,客戶端訪問(wèn)hive服務(wù),就可以連接到元數(shù)據(jù)這一層,從而提供了更好的管理性和安全保障。
使用遠(yuǎn)程的metastore services,可以讓metastore services和hive services運(yùn)行在不同的進(jìn)程里,這樣也保證了hive的穩(wěn)定性,提升了hive services的效率。
Hive執(zhí)行過(guò)程
流程大致步驟為:
- 用戶提交查詢等任務(wù)給Driver。
- Driver為查詢操作創(chuàng)建一個(gè)session handler,接著dirver會(huì)發(fā)送查詢操作到compiler去生成一個(gè)execute plan
- Compiler根據(jù)用戶任務(wù)去MetaStore中獲取需要的Hive的元數(shù)據(jù)信息。這些元數(shù)據(jù)在后續(xù)stage中用作抽象語(yǔ)法樹的類型檢測(cè)和修剪。
- Compiler得到元數(shù)據(jù)信息,對(duì)task進(jìn)行編譯,先將HiveQL轉(zhuǎn)換為抽象語(yǔ)法樹,然后將抽象語(yǔ)法樹轉(zhuǎn)換成查詢塊,將查詢塊轉(zhuǎn)化為邏輯的查詢plan,重寫邏輯查詢plan,將邏輯plan轉(zhuǎn)化為物理的plan(MapReduce), 最后選擇最佳策略。
- 將最終的plan提交給Driver。
- Driver將plan轉(zhuǎn)交給ExecutionEngine去執(zhí)行,將獲取到的元數(shù)據(jù)信息,提交到JobTracker或者RsourceManager執(zhí)行該task,任務(wù)會(huì)直接讀取到HDFS中進(jìn)行相應(yīng)的操作。
- 獲取執(zhí)行的結(jié)果。
- 取得并返回執(zhí)行結(jié)果。
創(chuàng)建表
解析用戶提交的Hive語(yǔ)句->對(duì)其進(jìn)行解析->分解為表、字段、分區(qū)等Hive對(duì)象
根據(jù)解析到的信息構(gòu)建對(duì)應(yīng)的表、字段、分區(qū)等對(duì)象,從SEQUENCE_TABLE中獲取構(gòu)建對(duì)象的最新的ID,與構(gòu)建對(duì)象信息(名稱、類型等等)一同通過(guò)DAO方法寫入元數(shù)據(jù)庫(kù)的表中,成功后將SEQUENCE_TABLE中對(duì)應(yīng)的最新ID+5。
實(shí)際上常見(jiàn)的RDBMS都是通過(guò)這種方法進(jìn)行組織的,其系統(tǒng)表中和Hive元數(shù)據(jù)一樣顯示了這些ID信息。通過(guò)這些元數(shù)據(jù)可以很容易的讀取到數(shù)據(jù)。
優(yōu)化器
優(yōu)化器是一個(gè)不斷更新的組件,大部分plan的轉(zhuǎn)移都是通過(guò)優(yōu)化器完成的。
- 將多Multiple join 合并為一個(gè)Muti-way join
- 對(duì)join、group-by和自定義的MapReduce操作重新進(jìn)行劃分。
- 消減不必要的列。
- 在表的掃描操作中推行使用斷言。
- 對(duì)于已分區(qū)的表,消減不必要的分區(qū)。
- 在抽樣查詢中,消減不必要的桶。
- 優(yōu)化器還增加了局部聚合操作用于處理大分組聚合和增加再分區(qū)操作用于處理不對(duì)稱的分組聚合。
分享名稱:hive基本架構(gòu)
地址分享:
http://weahome.cn/article/gjshec.html