Hive技術原理解析

什麼是Hive?

       Hive是創建在 Hadoop 上的數據倉庫基礎構架。它提供了一系列的工具,能夠用來進行數據提取轉化加載(ETL),這是一種能夠存儲、查詢和分析存儲在 Hadoop 中的大規模數據的機制。Hive 定義了簡單的類 SQL 查詢語言,稱爲 HQL,它容許熟悉 SQL 的用戶查詢數據。同時,這個語言也容許熟悉 MapReduce 開發者的開發自定義的 mapper 和 reducer 來處理內建的 mapper 和 reducer 沒法完成的複雜的分析工做。
Hive 構建在基於靜態批處理的Hadoop 之上,Hadoop 一般都有較高的延遲而且在做業提交和調度的時候須要大量的開銷。所以,Hive 並不可以在大規模數據集上實現低延遲快速的查詢,例如,Hive 在幾百MB 的數據集上執行查詢通常有分鐘級的時間延遲。
Hive 並不適合那些須要低延遲的應用,例如,聯機事務處理(OLTP)。Hive 查詢操做過程嚴格遵照Hadoop MapReduce 的做業執行模型,Hive 將用戶的HiveQL 語句經過解釋器轉換爲MapReduce 做業提交到Hadoop 集羣上,Hadoop 監控做業執行過程,而後返回做業執行結果給用戶。Hive 並不是爲聯機事務處理而設計,Hive 並不提供實時的查詢和基於行級的數據更新操做。Hive 的最佳使用場合是大數據集的批處理做業,例如,網絡日誌分析。

Hive與Hadoop

       Hive的執行入口是Driver,執行的SQL語句首先提交到Drive驅動,而後調用compiler解釋驅動,最終解釋成MapReduce任務去執行。

Hive的服務端組件

1. Driver組件:該組件包括:Compiler、Optimizer、Executor,它能夠將Hive的編譯、解析、優化轉化爲MapReduce任務提交給Hadoop1中的JobTracker或者是Hadoop2中的SourceManager來進行實際的執行相應的任務。

2. MetaStore組件:存儲着hive的元數據信息,將本身的元數據存儲到了關係型數據庫當中,支持的數據庫主要有:Mysql、Derby、支持把metastore獨立出來放在遠程的集羣上面,使得hive更加健壯。元數據主要包括了表的名稱、表的列、分區和屬性、表的屬性(是否是外部表等等)、表的數據所在的目錄。

3. 用戶接口:CLI(Command Line Interface)(經常使用的接口:命令行模式)、Client:Hive的客戶端用戶鏈接至Hive Server ,在啓動Client的時候,須要制定Hive Server所在的節點,而且在該節點上啓動Hive Server、WUI:經過瀏覽器的方式訪問Hive。

Hive的工做原理

如圖:


流程大體步驟爲:
1. 用戶提交查詢等任務給Driver。
2. 編譯器得到該用戶的任務Plan。
3. 編譯器Compiler根據用戶任務去MetaStore中獲取須要的Hive的元數據信息。
4. 編譯器Compiler獲得元數據信息,對任務進行編譯,先將HiveQL轉換爲抽象語法樹,而後將抽象語法樹轉換成查詢塊,將查詢塊轉化爲邏輯的查詢計劃,重寫邏輯查詢計劃,將邏輯計劃轉化爲物理的計劃(MapReduce), 最後選擇最佳的策略。
5. 將最終的計劃提交給Driver。
6. Driver將計劃Plan轉交給ExecutionEngine去執行,獲取元數據信息,提交給JobTracker或者SourceManager執行該任務,任務會直接讀取HDFS中文件進行相應的操做。
7. 獲取執行的結果。
8. 取得並返回執行結果。

建立表時:
解析用戶提交的Hive語句-->對其進行解析-->分解爲表、字段、分區等Hive對象。根據解析到的信息構建對應的表、字段、分區等對象,從SEQUENCE_TABLE中獲取構建對象的最新的ID,與構建對象信息(名稱、類型等等)一同經過DAO方法寫入元數據庫的表中,成功後將SEQUENCE_TABLE中對應的最新ID+5.實際上常見的RDBMS都是經過這種方法進行組織的,其系統表中和Hive元數據同樣顯示了這些ID信息。經過這些元數據能夠很容易的讀取到數據。

Hive編譯過程

基本流程爲:將HiveQL轉化爲抽象語法樹再轉爲查詢塊而後轉爲邏輯查詢計劃再轉爲物理查詢計劃最終選擇最佳決策的過程。

優化器的主要功能:
1. 將多Multiple join 合併爲一個Muti-way join
2. 對join、group-by和自定義的MapReduce操做從新進行劃分。
3. 消減沒必要要的列。
4. 在表的掃描操做中推行使用斷言。
5. 對於已分區的表,消減沒必要要的分區。
6. 在抽樣查詢中,消減沒必要要的桶。
7. 優化器還增長了局部聚合操做用於處理大分組聚合和增長再分區操做用於處理不對稱的分組聚合。


Hive的數據類型

Hive支持原子和複雜數據類型,原子數據類型包括:數據值、布爾類型、字符串類型等,複雜的類型包括:Array、Map和Struct。其中Array和Map和java中的Array和Map是類似的,Struct和C語言中的Struct類似。
例如:
[sql]  view plain  copy
  1. Create table test(  
  2. col1 Array<int>,  
  3. col2 Map<String,int>,  
  4. col3 Struct<a:String,b:int,c:Double>  
  5. );  


注意:
1. 原子數據類型是能夠進行隱式的轉換的,例如tinyInt類型會自動轉爲Int類型可是不能由int自動轉爲tinyInt類型。
2. 全部的整數類型、Float和String類型均可以轉換爲Double類型。
3. TinyInt、SmallInt、Int均可以轉爲Float類型。
4. Boolean 類型不能夠轉換爲其餘的任何類型。
5. 能夠經過使用Cast操做顯示的進行數據轉換,例如Cast('1' as int);將字符串轉爲整型,若是強制轉換失敗如:Cast('X' as int);表達式返回的是NULL;

Hive的特色