1. 程式人生 > >大資料時代--Hive技術原理解析

大資料時代--Hive技術原理解析

本文旨在講解Hive的執行原理,幫助使用者更好的瞭解在使用的過程中它做了些什麼工作,深入的理解他的工作機制,提高開發人員理論層面的知識。後面會逐漸推出Hive使用、Hbase原理與使用等大資料專題類文章,敬請關注。

什麼是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相似。 例如:
Create table test(
col1 Array<int>,
col2 Map<String,int>,
col3 Struct<a:String,b:int,c:Double>
);

注意: 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的特點