Hive —— Design and Architecture
目錄
- 一、Hive Architecture
- Hive架構(gòu)圖
- Hive側(cè)組件
- 執(zhí)行流程
- 二、Hive Data Model
- 三、Metastore
- 存在原因
- Metadata Objects(元數(shù)據(jù)對(duì)象)
- Metastore Architecture(元數(shù)據(jù)架構(gòu))
- Metastore Interface(元數(shù)據(jù)查詢接口)
- 四、Compiler(解析器)
一、Hive Architecture
Hive架構(gòu)圖
Hive側(cè)組件
上圖展示了Hive的主要構(gòu)成組件及Hive與Hadoop的交互過程。如圖中所示,Hive主要組件有:
- UI:用戶提交查詢和執(zhí)行其他操作的Hive交互接口。
- Driver:接收查詢請(qǐng)求的組件,該組件實(shí)現(xiàn)了會(huì)話管理并提供了基于JDBC/ODBC 接口模型的excute和fetch APIs。
- Compiler:用于解析查詢的組件,對(duì)于不同的查詢語句塊和查詢表達(dá)式進(jìn)行語義分析并且最終根據(jù)將從Metastore中查找的表和分區(qū)元數(shù)據(jù)的生成執(zhí)行計(jì)劃。
- Metastore:該組件存儲(chǔ)了倉庫中所有表及分區(qū)的結(jié)構(gòu)信息,包括列和類對(duì)應(yīng)數(shù)據(jù)類型,讀寫數(shù)據(jù)所需的序列化器和反序列化器以及存儲(chǔ)數(shù)據(jù)的相應(yīng)HDFS文件。
- Execution Engine:執(zhí)行由Complier生成的執(zhí)行計(jì)劃。這個(gè)執(zhí)行計(jì)劃是一個(gè)階段性DAG圖。執(zhí)行引擎管理著不同階段的執(zhí)行計(jì)劃并且執(zhí)行在正確的系統(tǒng)組件上執(zhí)行相應(yīng)階段的操作。
執(zhí)行流程
UI組件(客戶端)調(diào)用執(zhí)行查詢API,將查詢語句發(fā)送至Driver組件。(圖中步驟1)
Driver組件針對(duì)該次查詢創(chuàng)建一個(gè)會(huì)話并且將查詢語句發(fā)送至Compiler組件生成執(zhí)行計(jì)劃。(圖中步驟2)
Compiler從Metastore獲取必要的元數(shù)據(jù)信息。(圖中步驟3+4)
① 元數(shù)據(jù)信息主要是用于查詢語句的類型檢測,同時(shí)確定具體需要查詢的分區(qū)。
Compiler接下來把生成的執(zhí)行階段DAG圖發(fā)送給Driver。(圖中步驟5)
① 每個(gè)執(zhí)行階段要么是一個(gè)Map/Reduce任務(wù),要么是Metadata操作或HDFS操作。 ② 如果是Map/Reduce操作,執(zhí)行計(jì)劃包含map運(yùn)算樹(在Mapper上執(zhí)行的操作)和一個(gè) reduce 運(yùn)算樹(在Reducer上執(zhí)行的操作)。
Driver獲取到執(zhí)行計(jì)劃后將計(jì)劃提交給執(zhí)行引擎,執(zhí)行引擎與Hadoop交互后獲取執(zhí)行結(jié)果。(圖中步驟6.1、6.2、6.3)
① 對(duì)于每個(gè)執(zhí)行任務(wù)(Map/Reduce),相關(guān)查詢表或中間狀態(tài)數(shù)據(jù)(Mapper生成待被Reducer拉取)的反序列化器會(huì)被用于讀取HDFS中關(guān)聯(lián)的文件并將數(shù)據(jù)給到相應(yīng)的運(yùn)算操作樹。
② 一旦輸出開始生成,它會(huì)通過序列化器被寫入一個(gè)臨時(shí)的HDFS文件(發(fā)生在Map端,因?yàn)镸R任務(wù)可能無需Redcue過程)。
③ 臨時(shí)數(shù)據(jù)文件會(huì)被用于下一階段Map/Redcue任務(wù)。
④ 如果是DML操作,則最終生成的臨時(shí)文件會(huì)被移動(dòng)到table對(duì)應(yīng)的文件位置。這是為了確保臟數(shù)據(jù)不會(huì)被讀取到(文件重命名在HDFS中是原子操作)。
對(duì)于單純的查詢來說,最終生成的臨時(shí)文件即為查詢結(jié)果,該文件會(huì)被執(zhí)行引擎查詢直接從HDFS中讀取,最后將其返回給UI組件(客戶端)。
二、Hive Data Model
Hive中的數(shù)據(jù)被劃分成:
- 表格(Table):類似于關(guān)系數(shù)據(jù)庫中的表。表能夠被可以過濾、投影、連接(join)和合并(union)。此外,表的所有數(shù)據(jù)都存儲(chǔ)在 HDFS中。 Hive 還支持外部表的概念,通過建表 DDL 指定外部表位置,可以在 HDFS中預(yù)先存在的文件或目錄上創(chuàng)建表。表中的行被劃分成類似于關(guān)系數(shù)據(jù)庫的帶類型列。
- 分區(qū)(Partition): 每個(gè)表可以有一個(gè)或多個(gè)分區(qū)鍵來確定數(shù)據(jù)的存儲(chǔ)方式,例如,具有日期分區(qū)列 ds 的表 T 在HDFS中會(huì)生成特定日期目錄并將該日期數(shù)據(jù)存儲(chǔ)在相應(yīng)目錄下。分區(qū)能夠減少查詢時(shí)的數(shù)據(jù)遍歷量,例如,對(duì)T中ds='2008-09-01’的查詢只需要找HDFS 中的T表格數(shù)據(jù)目錄ds=2008-09-01中的數(shù)據(jù)進(jìn)行查詢即可。
- 桶(Buckets):每個(gè)分區(qū)中的數(shù)據(jù)會(huì)根據(jù)表中列的hash值劃分入不同的Bucket。每個(gè)bucket作為一個(gè)文件存儲(chǔ)在分區(qū)目錄下。分桶對(duì)于抽樣類型查詢的高效執(zhí)行提供了遍歷。
除了原始數(shù)據(jù)類型 (integers, floating point numbers, generic strings, dates and booleans),Hive還支持array和map。此外,用戶可以根據(jù)任何原始數(shù)據(jù)類型、集合或其他用戶自定義的數(shù)據(jù)類型以編程方式組合成新數(shù)據(jù)類型。 數(shù)據(jù)類型體系與 SerDe(Serailization/Deserialization)和對(duì)象檢查器接口密切相關(guān)。用戶可以通過實(shí)現(xiàn)自己的對(duì)象檢查器來創(chuàng)建自己的類型,并使用這些對(duì)象檢查器創(chuàng)建自己的 SerDes 將其數(shù)據(jù)序列化和反序列化為 HDFS 文件。當(dāng)涉及到解析其他數(shù)據(jù)結(jié)果和更豐富的類型時(shí),這Ser/De兩個(gè)接口提供了必要的鉤子來擴(kuò)展 Hive 的功能。
ListObjectInspector、StructObjectInspector 和 MapObjectInspector 等內(nèi)置對(duì)象檢查器提供了必要的原語,以可擴(kuò)展的方式組合更豐富的類型。 對(duì)于 map 和 array ,提供了有用的內(nèi)置函數(shù),如獲取當(dāng)前大小和按索引操作。
.符號(hào)用于獲取嵌套類型字段,例如 a.b.c = 1 查看類型 a 的字段 b 的字段 c 并將其與 1 進(jìn)行比較。
三、Metastore
存在原因
Metastore 提供了數(shù)據(jù)倉庫的兩個(gè)重要但經(jīng)常被忽視的功能:數(shù)據(jù)抽象和數(shù)據(jù)發(fā)現(xiàn)。 如果沒有 Hive 中提供的數(shù)據(jù)抽象,用戶必須在查詢時(shí)提供有關(guān)數(shù)據(jù)格式、提取器和加載器的信息。
在 Hive 中,此信息在表創(chuàng)建期間給出,并在每次引用表時(shí)重復(fù)使用。這與傳統(tǒng)的數(shù)倉系統(tǒng)非常相似。第二個(gè)功能,數(shù)據(jù)發(fā)現(xiàn),使用戶能夠發(fā)現(xiàn)和搜尋倉庫中的相關(guān)的特定數(shù)據(jù)。可以使用此metadata構(gòu)建其他工具,以暴露出關(guān)于數(shù)據(jù)及其可用性的信息并進(jìn)行可能的增強(qiáng)。
Hive 通過提供與 Hive查詢處理系統(tǒng)緊密集成的Metastore來實(shí)現(xiàn)這兩個(gè)功能,以便數(shù)據(jù)和元數(shù)據(jù)同步。
Metadata Objects(元數(shù)據(jù)對(duì)象)
-
Database
Database是table的命名空間。數(shù)據(jù)庫 ‘default’ 用于沒有用戶提供的數(shù)據(jù)庫名稱的表。 -
Table
table的元數(shù)據(jù)含有的信息有列數(shù)組、所有者、存儲(chǔ) 和Ser/De。它還可以包含任何用戶提供的K-V數(shù)據(jù)。
存儲(chǔ)信息元數(shù)據(jù)包括底層數(shù)據(jù)的位置、文件輸入輸出格式和分桶信息。
SerDe 元數(shù)據(jù)包括序列化器和反序列化器的實(shí)現(xiàn)類以及實(shí)現(xiàn)所需的任何支持信息。 所有這些信息都可以在創(chuàng)建表的過程中提供。 -
Partition
每個(gè)分區(qū)都可以有自己的列以及SerDe和存儲(chǔ)信息。這有助于架構(gòu)更改而不影響舊分區(qū)。
Metastore Architecture(元數(shù)據(jù)架構(gòu))
Metastore 是具有數(shù)據(jù)庫或文件支持的對(duì)象存儲(chǔ)。
數(shù)據(jù)庫支持的存儲(chǔ)是使用稱為 DataNucleus 的ORM方案實(shí)現(xiàn)的。將其存儲(chǔ)在關(guān)系數(shù)據(jù)庫中的主要目的是確保元數(shù)據(jù)的可查詢性,但使用單獨(dú)的元數(shù)據(jù)存儲(chǔ)而不是使用 HDFS 的帶來的問題是同步和擴(kuò)展性問題。
此外,由于HDFS對(duì)文件的隨機(jī)讀寫不友好或者根本無實(shí)現(xiàn),對(duì)于需要更改元數(shù)據(jù)的需求無法很好支持。再加上關(guān)系存儲(chǔ)的可查詢性優(yōu)勢,使用ORM方案實(shí)現(xiàn)元數(shù)據(jù)存儲(chǔ)是更為合適的。
Metastore Interface(元數(shù)據(jù)查詢接口)
Metastore 提供了一個(gè) Thrift 接口來操作和查詢 Hive 元數(shù)據(jù)。 Thrift 提供了許多流行語言的綁定。 第三方工具可以使用此接口將Hive元數(shù)據(jù)集成到其他業(yè)務(wù)元數(shù)據(jù)存儲(chǔ)庫中。
四、Compiler(解析器)
Complier是用于解析查詢的組件,對(duì)于不同的查詢語句塊和查詢表達(dá)式進(jìn)行語義分析并且最終根據(jù)將從Metastore中查找的表和分區(qū)元數(shù)據(jù)的生成執(zhí)行計(jì)劃。其包含相關(guān)階段有:
-
Parser
將查詢語句轉(zhuǎn)換為解析樹形式(詞法分析)。 -
Semantic Analyser
將解析樹轉(zhuǎn)換為內(nèi)部查詢表示,它仍然是基于塊的而不是運(yùn)算符樹。在這一步,將驗(yàn)證列名并執(zhí)行 * 等擴(kuò)展,并且還會(huì)執(zhí)行類型檢查和任何隱式類型轉(zhuǎn)換。
通常情況下查詢表是分區(qū)表,則緩存該表的所有查詢表達(dá)式,以便之后可以使用它們來裁剪掉不需要的分區(qū)。如果查詢已指定采樣,則也會(huì)收集該采樣以供稍后使用。 -
Logical Plan Generator
將內(nèi)部查詢表示轉(zhuǎn)換為執(zhí)行計(jì)劃,該計(jì)劃由運(yùn)算符樹組成。一些運(yùn)算符是關(guān)系型運(yùn)算符,如“filter”、“join”等。但一些運(yùn)算符是 Hive 特定的,之后用于將此計(jì)劃轉(zhuǎn)換為一系列 map-reduce 作業(yè),reduceSink就是這樣一個(gè)例子,它出現(xiàn)在 map-reduce 邊界。
此步驟還包括優(yōu)化器轉(zhuǎn)變計(jì)劃以提高性能。這些轉(zhuǎn)換例如:將一系列join轉(zhuǎn)換為單個(gè)多路join;對(duì)于 group by 在 map 端執(zhí)行部分聚合;在 map/reduce 兩個(gè)階段執(zhí)行都 group-by以避免出現(xiàn)單Reduce階段分組可能成為分組鍵存在傾斜數(shù)據(jù)的瓶頸的情況。
每個(gè)操作符都包含一個(gè)描述符,它是一個(gè)可序列化的對(duì)象。 -
Query Plan Generator
將執(zhí)行計(jì)劃轉(zhuǎn)換為一系列MR任務(wù)。運(yùn)算符樹被遞歸遍歷,分解成一系列可序列化的 map-reduce 任務(wù),這些任務(wù)稍后可以提交給 Hadoop MR框架。
ReduceSink操作符是MR任務(wù)的結(jié)束邊界,它的描述符包含了需要進(jìn)行reduce的keys。reduceSink中指定的這些keys在MR任務(wù)中作為reduce階段的key被使用。
執(zhí)行計(jì)劃包含了查詢指定所需的樣本/分區(qū),該計(jì)劃被序列化并寫入文件。
參考資料:https://cwiki.apache.org/confluence/display/Hive/Design#
總結(jié)
以上是生活随笔為你收集整理的Hive —— Design and Architecture的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Reasoning with Sarca
- 下一篇: play框架2.5.6教程——使用pla