摘要:從中獲取用戶對查詢樹中的表達式進行數據類型檢查和基于分區的查詢預測所需的元數據信息。生成的執行計劃是一個由不同的組成的有向無環圖,每個有可能是一個任務,或者元數據信息操作,或者操作。如果任務執行會導致元素局信息的變動,會通知進行元數據修改。
1、 Hive架構 Hive的核心組件包括:本系列文章使用的硬件環境為:centOS 6.5 64bit / 4G RAM 30G HHD
使用的Hive版本為:hive2.0.0 / Hadoop版本為2.6.4 / JDK版本為:1.8.0
UI:用戶提交查詢或其他系統操作的接口,可能是命令行工具,也可能是基于Web的界面工具
Driver:接收查詢的組件,Driver實現了會話的概念,并且提供基于JDBC和ODBC接口的執行和獲取的API模型。
Compiler:解析用戶查詢的組件,對不同的查詢塊和查詢表達式進行語法檢查,并最終借助于MetaStore提供的表和分區的元數據信息生成一個執行計劃。
Metastore:存儲數據倉庫中的眾多表和分區的結構信息,字段和字段類型信息,讀寫數據所需的序列化和反序列化的反序列化工具信息,以及對應的數據在HDFS存儲的位置信息等。
Execution Engine:執行Compiler生成的執行計劃。Compiler生成的執行計劃是一個由不同stage組成的有向無環圖,Execution Engine管理不同stage之間的依賴關系,然后在合適的系統組件上執行這些stage
Hive任務的執行流程step1:用戶通過UI組件提交查詢語句或其他指令,UI組件調用Driver組件的命令執行接口
step2:Driver為任務生成一個會話,并且將這個任務提交給Compiler組件。
step3:Compiler從Metastore中獲取用戶對查詢樹中的表達式進行數據類型檢查和基于分區的查詢預測所需的元數據信息。并生成執行計劃。Compiler生成的執行計劃是一個由不同的stage組成的有向無環圖,每個stage有可能是一個MapReduce任務,或者元數據信息操作,或者HDFS操作。如果是MapReduce類型的stage,那么這個Stage會包含一個Map操作樹,和Reduce操作樹。最后Compiler會向Driver提交生成的執行計劃。
step4:Driver生成執行計劃之后,向Execution Engine提交執行計劃
step5:Execution Engine收到執行計劃之后,會根據stage之間的依賴關系,然后向合適的外部組件提交這些stage(不同部署方式會有所不同)。外部組件(比如Hadoop)會將執行結構保存成臨時文件。如果任務執行會導致元素局信息的變動,Execution Engine會通知MetaStore進行元數據修改。
step6:Driver通過Execution Engine獲取執行結果,并將執行結果返回給終端用戶
2、 Hive的數據模型hive的數據組織結構為:
database:和一般關系型數據庫(例如mysql,sqlserver)中的database的概念是類似的,其作用主要是將用戶建的表進行隔離。實際存儲的時候就是一個數據庫的所有表存儲在一個文件夾中。
tables:表是實際存放數據的地方,和DBMS中類似,HIve中的表實際上也是二維表,分為行和列,不同之處在于hive中除了一些原生類型之外,還支持List和Map類型,當然用戶也可以自定義類型
partitions:為了便于用戶組織數據,Hive中提供了一個分區的概念,和Oracle中的分區類似,可以按照某個字段的不同取值,將數據組織在不同的分區中。現在Hive支持多級分區,即對分區之后的數據再進行分區,比如公司訂單數據,可以先按照日期進行分區,每天一個分區,然后在每天的分區按照銷售區域進行分區。實際儲存時每個分區實際上就是表目錄下的一個子目錄,多級分區就是子子目錄,依次類推。不是所有的表都必須分區
buckets:Hive中分區的數據可以按照某個字段拆分成多個文件,進行存儲。bucket能夠允許系統有效的進行基于字段值得抽樣。并非所有的表都會使用bucket
row:就是一條數據記錄,在默存儲方案下,Hive會指定一個航分割符號,對數據進行分割,默認為換行符。行分割符可以在建表的時候指定。
col:一行數據中可能會包含多個列(字段)。字段與字段之間使用列分割符進行分割。默認的列分隔符為