轉載自http://blog.csdn.net/wangyang1354/article/details/50570903
什么是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>
- );