Hive基礎知識介紹
Hive是基於Hadoop的資料倉庫工具,可對儲存在HDFS上的檔案中的資料進行資料整理、特殊查詢和分析處理,提供了類似於SQL語言的查詢語言-HiveSQL,可通過HQL語句實現簡單的MR統計,Hive將HQL語句轉換成MR任務進行執行。
1-1 資料倉庫概念
資料倉庫(Data Warehouse)是一個面向主題的(Subject Oriented)、整合的(Integrated)、相對穩定的(Non-Volatile)、反應歷史變化(Time Variant)的資料集合,用於支援管理決策。
資料倉庫體系結構通常含四個層次:資料來源、資料儲存和管理、資料服務、資料應用。
資料來源:是資料倉庫的資料來源,含外部資料、現有業務系統和文件資料等;資料整合:完成資料的抽取、清洗、轉換和載入任務,資料來源中的資料採用ETL(Extract-Transform-Load)工具以固定的週期載入到資料倉庫中。資料儲存和管理:此層次主要涉及對資料的儲存和管理,含資料倉庫、資料集市、資料倉庫檢測、執行與維護工具和元資料管理等。資料服務:為前端和應用提供資料服務,可直接從資料倉庫中獲取資料供前端應用使用,也可通過OLAP(OnLine Analytical Processing,聯機分析處理)伺服器為前端應用提供負責的資料服務。資料應用:此層次直接面向用戶,含資料查詢工具、自由報表工具、資料分析工具、資料探勘工具和各類應用系統。
1-2 傳統資料倉庫的問題
1)無法滿足快速增長的海量資料儲存需求,傳統資料倉庫基於關係型資料庫,橫向擴充套件性較差,縱向擴充套件有限。
2)無法處理不同型別的資料,傳統資料倉庫只能儲存結構化資料,企業業務發展,資料來源的格式越來越豐富。
3)傳統資料倉庫建立在關係型資料倉庫之上,計算和處理能力不足,當資料量達到TB級後基本無法獲得好的效能。
1-3 Hive
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)應用程式。
二、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資料庫例項。此模組主要儲存表模式和其他系統元資料,如表的名稱、表的列及其屬性、表的分割槽及其屬性、表的屬性、表中資料所在位置資訊等。
三、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
四、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”