Hive基礎知識介紹

Hive是基於Hadoop的數據倉庫工具,可對存儲在HDFS上的文件中的數據進行數據整理、特殊查詢和分析處理,提供了相似於SQL語言的查詢語言-HiveSQL,可經過HQL語句實現簡單的MR統計,Hive將HQL語句轉換成MR任務進行執行。前端

 

1-1 數據倉庫概念算法

數據倉庫(Data Warehouse)是一個面向主題的(Subject Oriented)、集成的(Integrated)、相對穩定的(Non-Volatile)、反應歷史變化(Time Variant)的數據集合,用於支持管理決策。sql

數據倉庫體系結構一般含四個層次:數據源、數據存儲和管理、數據服務、數據應用。
數據源:是數據倉庫的數據來源,含外部數據、現有業務系統和文檔資料等;數據集成:完成數據的抽取、清洗、轉換和加載任務,數據源中的數據採用ETL(Extract-Transform-Load)工具以固定的週期加載到數據倉庫中。數據存儲和管理:此層次主要涉及對數據的存儲和管理,含數據倉庫、數據集市、數據倉庫檢測、運行與維護工具和元數據管理等數據服務:爲前端和應用提供數據服務,可直接從數據倉庫中獲取數據供前端應用使用,也可經過OLAP(OnLine Analytical Processing,聯機分析處理)服務器爲前端應用提供負責的數據服務。數據應用:此層次直接面向用戶,含數據查詢工具、自由報表工具、數據分析工具、數據挖掘工具和各種應用系統。
 數據庫

1-2 傳統數據倉庫的問題
1)沒法知足快速增加的海量數據存儲需求,傳統數據倉庫基於關係型數據庫,橫向擴展性較差,縱向擴展有限。編程

2)沒法處理不一樣類型的數據,傳統數據倉庫只能存儲結構化數據,企業業務發展,數據源的格式愈來愈豐富。服務器

3)傳統數據倉庫創建在關係型數據倉庫之上,計算和處理能力不足,當數據量達到TB級後基本沒法得到好的性能。
 架構

1-3 Hiveapp

Hive是創建在Hadoop之上的數據倉庫,由Facebook開發,在某種程度上能夠當作是用戶編程接口,自己並不存儲和處理數據,依賴於HDFS存儲數據,依賴MR處理數據。有類SQL語言HiveQL,不徹底支持SQL標準,如,不支持更新操做、索引和事務,其子查詢和鏈接操做也存在不少限制。框架

Hive把HQL語句轉換成MR任務後,採用批處理的方式對海量數據進行處理。數據倉庫存儲的是靜態數據,很適合採用MR進行批處理。Hive還提供了一系列對數據進行提取、轉換、加載的工具,能夠存儲、查詢和分析存儲在HDFS上的數據。
 機器學習

1-4 Hive與Hadoop生態系統中其餘組件的關係
Hive依賴於HDFS存儲數據,依賴MR處理數據;Pig可做爲Hive的替代工具,是一種數據流語言和運行環境,適合用於在Hadoop平臺上查詢半結構化數據集,用於與ETL過程的一部分,即將外部數據裝載到Hadoop集羣中,轉換爲用戶須要的數據格式;HBase是一個面向列的、分佈式可伸縮的數據庫,可提供數據的實時訪問功能,而Hive只能處理靜態數據,主要是BI報表數據,Hive的初衷是爲減小複雜MR應用程序的編寫工做,HBase則是爲了實現對數據的實時訪問。 

 

1-5 Hive與傳統數據庫的對比

 

 

1-6 Hive的部署和應用

1-6-1 Hive在企業大數據分析平臺中的應用

當前企業中部署的大數據分析平臺,除Hadoop的基本組件HDFS和MR外,還結合使用Hive、Pig、Hbase、Mahout,從而知足不一樣業務場景需求。

上圖是企業中一種常見的大數據分析平臺部署框架 ,在這種部署架構中:
1)Hive和Pig用於報表中心,Hive用於分析報表,Pig用於報表中數據的轉換工做。

2)HBase用於在線業務,HDFS不支持隨機讀寫操做,而HBase正是爲此開發,可較好地支持實時訪問數據。

3)Mahout提供一些可擴展的機器學習領域的經典算法實現,用於建立商務智能(BI)應用程序。
 

 

2、Hive系統架構

下圖顯示Hive的主要組成模塊、Hive如何與Hadoop交互工做、以及從外部訪問Hive的幾種典型方式。 

Hive主要由如下三個模塊組成:

1)用戶接口模塊,含CLI、HWI、JDBC、Thrift Server等,用來實現對Hive的訪問。

CLI是Hive自帶的命令行界面;HWI是Hive的一個簡單網頁界面;JDBC、ODBC以及Thrift Server可向用戶提供進行編程的接口,其中Thrift Server是基於Thrift軟件框架開發的,提供Hive的RPC通訊接口。

2)驅動模塊(Driver),含編譯器、優化器、執行器等,負責把HiveQL語句轉換成一系列MR做業,全部命令和查詢都會進入驅動模塊,經過該模塊的解析變異,對計算過程進行優化,而後按照指定的步驟執行。

3)元數據存儲模塊(Metastore),是一個獨立的關係型數據庫,一般與MySQL數據庫鏈接後建立的一個MySQL實例,也能夠是Hive自帶的Derby數據庫實例。此模塊主要保存表模式和其餘系統元數據,如表的名稱、表的列及其屬性、表的分區及其屬性、表的屬性、表中數據所在位置信息等。
 

3、Hive工做原理

3-1 SQL語句轉換成MapReduce做業的基本原理

3-1-1 用MapReduce實現鏈接操做

假設鏈接(join)的兩個表分別是用戶表User(uid,name)和訂單表Order(uid,orderid),具體的SQL命令:

select name,orderid from User u join Order o on u.uid=o.uid;

上圖描述了鏈接操做轉換爲MapReduce操做任務的具體執行過程。
首先,在Map階段,

1)User表以uid爲key,以name和表的標記位(這裏User的標記位記爲1)爲value,進行Map操做,把表中記錄轉換生成一系列KV對的形式。好比,User表中記錄(1,Lily)轉換爲鍵值對(1,<1,Lily>),其中第一個「1」是uid的值,第二個「1」是表User的標記位,用來標示這個鍵值對來自User表;

2)一樣,Order表以uid爲key,以orderid和表的標記位(這裏表Order的標記位記爲2)爲值進行Map操做,把表中的記錄轉換生成一系列KV對的形式;

3)接着,在Shuffle階段,把User表和Order表生成的KV對按鍵值進行Hash,而後傳送給對應的Reduce機器執行。好比KV對(1,<1,Lily>)、(1,<2,101>)、(1,<2,102>)傳送到同一臺Reduce機器上。當Reduce機器接收到這些KV對時,還需按表的標記位對這些鍵值對進行排序,以優化鏈接操做;

4)最後,在Reduce階段,對同一臺Reduce機器上的鍵值對,根據「值」(value)中的表標記位,對來自表User和Order的數據進行笛卡爾積鏈接操做,以生成最終的結果。好比鍵值對(1,<1,Lily>)與鍵值對(1,<2,101>)、(1,<2,102>)的鏈接結果是(Lily,101)、(Lily,102)。
 

 

3-1-2 用MR實現分組操做

假設分數表Score(rank, level),具備rank(排名)和level(級別)兩個屬性,須要進行一個分組(Group By)操做,功能是把表Score的不一樣片斷按照rank和level的組合值進行合併,並計算不一樣的組合值有幾條記錄。SQL語句命令以下:
 

select rank,level,count(*) as value from score group by rank,level;

上圖描述分組操做轉化爲MapReduce任務的具體執行過程。
1)首先,在Map階段,對錶Score進行Map操做,生成一系列KV對,其鍵爲<rank, level>,值爲「擁有該<rank, level>組合值的記錄的條數」。好比,Score表的第一片斷中有兩條記錄(A,1),因此進行Map操做後,轉化爲鍵值對(<A,1>,2);

2)接着在Shuffle階段,對Score表生成的鍵值對,按照「鍵」的值進行Hash,而後根據Hash結果傳送給對應的Reduce機器去執行。好比,鍵值對(<A,1>,2)、(<A,1>,1)傳送到同一臺Reduce機器上,鍵值對(<B,2>,1)傳送另外一Reduce機器上。而後,Reduce機器對接收到的這些鍵值對,按「鍵」的值進行排序;

3)在Reduce階段,把具備相同鍵的全部鍵值對的「值」進行累加,生成分組的最終結果。好比,在同一臺Reduce機器上的鍵值對(<A,1>,2)和(<A,1>,1)Reduce操做後的輸出結果爲(A,1,3)。

 

 

3-2 Hive中SQL查詢轉換成MR做業的過程

當Hive接收到一條HQL語句後,須要與Hadoop交互工做來完成該操做。HQL首先進入驅動模塊,由驅動模塊中的編譯器解析編譯,並由優化器對該操做進行優化計算,而後交給執行器去執行。執行器一般啓動一個或多個MR任務,有時也不啓動(如SELECT * FROM tb1,全表掃描,不存在投影和選擇操做)

上圖是Hive把HQL語句轉化成MR任務進行執行的詳細過程。
1)由驅動模塊中的編譯器–Antlr語言識別工具,對用戶輸入的SQL語句進行詞法和語法解析,將HQL語句轉換成抽象語法樹(AST Tree)的形式;

2)遍歷抽象語法樹,轉化成QueryBlock查詢單元。由於AST結構複雜,不方便直接翻譯成MR算法程序。其中QueryBlock是一條最基本的SQL語法組成單元,包括輸入源、計算過程、和輸入三個部分;

3)遍歷QueryBlock,生成OperatorTree(操做樹),OperatorTree由不少邏輯操做符組成,如TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator和ReduceSinkOperator等。這些邏輯操做符可在Map、Reduce階段完成某一特定操做;

3)Hive驅動模塊中的邏輯優化器對OperatorTree進行優化,變換OperatorTree的形式,合併多餘的操做符,減小MR任務數、以及Shuffle階段的數據量;遍歷優化後的OperatorTree,根據OperatorTree中的邏輯操做符生成須要執行的MR任務;啓動

4)Hive驅動模塊中的物理優化器,對生成的MR任務進行優化,生成最終的MR任務執行計劃;

5)最後,有Hive驅動模塊中的執行器,對最終的MR任務執行輸出。

Hive驅動模塊中的執行器執行最終的MR任務時,Hive自己不會生成MR算法程序。它經過一個表示「Job執行計劃」的XML文件,來驅動內置的、原生的Mapper和Reducer模塊。Hive經過和JobTracker通訊來初始化MR任務,而不需直接部署在JobTracker所在管理節點上執行。一般在大型集羣中,會有專門的網關機來部署Hive工具,這些網關機的做用主要是遠程操做和管理節點上的JobTracker通訊來執行任務。Hive要處理的數據文件常存儲在HDFS上,HDFS由名稱節點(NameNode)來管理。

JobTracker/TaskTracker 
NameNode/DataNode

4、Hive HA基本原理

在實際應用中,Hive也暴露出不穩定的問題,在極少數狀況下,會出現端口不響應或進程丟失問題。Hive HA(High Availablity)能夠解決這類問題。

在Hive HA中,在Hadoop集羣上構建的數據倉庫是由多個Hive實例進行管理的,這些Hive實例被歸入到一個資源池中,由HAProxy提供統一的對外接口。客戶端的查詢請求,首先訪問HAProxy,由HAProxy對訪問請求進行轉發。HAProxy收到請求後,會輪詢資源池中可用的Hive實例,執行邏輯可用性測試。
1)若是某個Hive實例邏輯可用,就會把客戶端的訪問請求轉發到Hive實例上;

2)若是某個實例不可用,就把它放入黑名單,並繼續從資源池中取出下一個Hive實例進行邏輯可用性測試。

3)對於黑名單中的Hive,Hive HA會每隔一段時間進行統一處理,首先嚐試重啓該Hive實例,若是重啓成功,就再次把它放入資源池中。

因爲HAProxy提供統一的對外訪問接口,所以,對於程序開發人員來講,可把它當作一臺超強「Hive」。  

相關文章
相關標籤/搜索