一、Hadoop介紹
Hadoop是一個由Apache基金會所開發的分布式系統基礎架構。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力進行高速運算和存儲。
Hadoop實現了一個分布式文件系統(HadoopDistributedFileSystem),簡稱HDFS。HDFS有高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(highthroughput)來訪問應用程序的數據,適合那些有著超大數據集(largedataset)的應用程序。HDFS放寬了(relax)POSIX的要求,可以以流的形式訪問(streamingaccess)文件系統中的數據。
Hadoop的核心架構

HDFS
對外部客戶機而言,HDFS就像一個傳統的分級文件系統。可以創建、刪除、移動或重命名文件,等等。但是HDFS的架構是基于一組特定的節點構建的(參見圖1),這是由它自身的特點決定的。這些節點包括NameNode(僅一個),它在HDFS內部提供元數據服務;DataNode,它為HDFS提供存儲塊。由于僅存在一個NameNode,因此這是HDFS的一個缺點(單點失敗)。
存儲在HDFS中的文件被分成塊,然后將這些塊復制到多個計算機中(DataNode)。這與傳統的RAID架構大不相同。塊的大小(通常為64MB)和復制的塊數量在創建文件時由客戶機決定。NameNode可以控制所有文件操作。HDFS內部的所有通信都基于標準的TCP/IP協議。
NameNode
NameNode是一個通常在HDFS實例中的單獨機器上運行的軟件。它負責管理文件系統名稱空間和控制外部客戶機的訪問。NameNode決定是否將文件映射到DataNode上的復制塊上。對于最常見的3個復制塊,第一個復制塊存儲在同一機架的不同節點上,最后一個復制塊存儲在不同機架的某個節點上。注意,這里需要您了解集群架構。
二、hive介紹
Hive是部署在hadoop集群上的數據倉庫工具。
數據庫和數據倉庫的區別:
數據庫(如常用關系型數據庫)可以支持實時增刪改查。
數據倉庫不僅僅是為了存放數據,它可以存放海量數據,而且可以查詢、分析和計算存儲在Hadoop中的大規模數據。但他有一個弱點,他不能進行實時的更新、刪除等操作。也就是一次寫入多次讀取。
Hive也定義了簡單的類SQL查詢語言,稱為QL,它允許熟悉SQL的用戶查詢數據。現在hive2.0也支持更新、索引和事務,幾乎SQL的其它特征都能支持。
Hive支持SQL92大部分功能,我們暫時可以把hive理解成一個關系型數據庫,語法和MySQL是幾乎是一樣的。
Hive是Hadoop上的數據倉庫基礎構架之一,是SQL解析引擎,它可以將SQL轉換成MapReduce任務,然后在Hadoop執行。
實際的I/O事務并沒有經過NameNode,只有表示DataNode和塊的文件映射的元數據經過NameNode。當外部客戶機發送請求要求創建文件時,NameNode會以塊標識和該塊的第一個副本的DataNodeIP地址作為響應。這個NameNode還會通知其他將要接收該塊的副本的DataNode。
NameNode在一個稱為FsImage的文件中存儲所有關于文件系統名稱空間的信息。這個文件和一個包含所有事務的記錄文件(這里是EditLog)將存儲在NameNode的本地文件系統上。FsImage和EditLog文件也需要復制副本,以防文件損壞或NameNode系統丟失。
NameNode本身不可避免地具有SPOF(SinglePointOfFailure)單點失效的風險,主備模式并不能解決這個問題,通過HadoopNon-stopnamenode才能實現100%uptime可用時間。
DataNode
DataNode也是一個通常在HDFS實例中的單獨機器上運行的軟件。Hadoop集群包含一個NameNode和大量DataNode。DataNode通常以機架的形式組織,機架通過一個交換機將所有系統連接起來。Hadoop的一個假設是:機架內部節點之間的傳輸速度快于機架間節點的傳輸速度。
DataNode響應來自HDFS客戶機的讀寫請求。它們還響應來自NameNode的創建、刪除和復制塊的命令。NameNode依賴來自每個DataNode的定期心跳(heartbeat)消息。每條消息都包含一個塊報告,NameNode可以根據這個報告驗證塊映射和其他文件系統元數據。如果DataNode不能發送心跳消息,NameNode將采取修復措施,重新復制在該節點上丟失的塊。
文件操作
可見,HDFS并不是一個萬能的文件系統。它的主要目的是支持以流的形式訪問寫入的大型文件。
如果客戶機想將文件寫到HDFS上,首先需要將該文件緩存到本地的臨時存儲。如果緩存的數據大于所需的HDFS塊大小,創建文件的請求將發送給NameNode。NameNode將以DataNode標識和目標塊響應客戶機。
同時也通知將要保存文件塊副本的DataNode。當客戶機開始將臨時文件發送給第一個DataNode時,將立即通過管道方式將塊內容轉發給副本DataNode。客戶機也負責創建保存在相同HDFS名稱空間中的校驗和(checksum)文件。
在最后的文件塊發送之后,NameNode將文件創建提交到它的持久化元數據存儲(在EditLog和FsImage文件)。
Linux集群
Hadoop框架可在單一的Linux平臺上使用(開發和調試時),官方提供MiniCluster作為單元測試使用,不過使用存放在機架上的商業服務器才能發揮它的力量。這些機架組成一個Hadoop集群。它通過集群拓撲知識決定如何在整個集群中分配作業和文件。Hadoop假定節點可能失敗,因此采用本機方法處理單個計算機甚至所有機架的失敗。
Hive的系統架構

?用戶接口,包括CLI(Shell命令行),JDBC/ODBC,WebUI
?MetaStore元數據庫,通常是存儲在關系數據庫如mysql,derby中
?Driver包含解釋器、編譯器、優化器、執行器
?Hadoop:用HDFS進行存儲,利用MapReduce進行計算
Hive的表和數據庫,對應的其實是HDFS(Hadoop分布式文件系統)的目錄/文件,按表名把文件夾分開。如果是分區表,則分區值是子文件夾,可以直接在MapReduceJob里使用這些數據。
三、Hive與Hadoop生態系統中其他組件的關系
1、Hive依賴于HDFS存儲數據,依賴MR處理數據;
2、Pig可作為Hive的替代工具,是一種數據流語言和運行環境,適合用于在Hadoop平臺上查詢半結構化數據集,用于與ETL過程的一部分,即將外部數據裝載到Hadoop集群中,轉換為用戶需要的數據格式;
3、HBase是一個面向列的、分布式可伸縮的數據庫,可提供數據的實時訪問功能,而Hive只能處理靜態數據,主要是BI報表數據,Hive的初衷是為減少復雜MR應用程序的編寫工作,HBase則是為了實現對數據的實時訪問。
Hive與傳統數據庫的對比
四、Hive的部署和應用
Hive在企業大數據分析平臺中的應用
當前企業中部署的大數據分析平臺,除Hadoop的基本組件HDFS和MR外,還結合使用Hive、Pig、HBase、Mahout,從而滿足不同業務場景需求。
圖企業中一種常見的大數據分析平臺部署框架
上圖是企業中一種常見的大數據分析平臺部署框架,在這種部署架構中:
Hive和Pig用于報表中心,Hive用于分析報表,Pig用于報表中數據的轉換工作。
HBase用于在線業務,HDFS不支持隨機讀寫操作,而HBase正是為此開發,可較好地支持實時訪問數據。
Mahout提供一些可擴展的機器學習領域的經典算法實現,用于創建商務智能(BI)應用程序。
五、Hive工作原理
1、SQL語句轉換成MapReduce作業的基本原理
1.1用MapReduce實現連接操作
假設連接(join)的兩個表分別是用戶表User(uid,name)和訂單表Order(uid,orderid),具體的SQL命令:
SELECTname,orderidFROMUseruJOINOrderoONu.uid=o.uid;
上圖描述了連接操作轉換為MapReduce操作任務的具體執行過程。
首先,在Map階段,
User表以uid為key,以name和表的標記位(這里User的標記位記為1)為value,進行Map操作,把表中記錄轉換生成一系列KV對的形式。比如,User表中記錄(1,Lily)轉換為鍵值對(1,《1,Lily》),其中第一個“1”是uid的值,第二個“1”是表User的標記位,用來標示這個鍵值對來自User表;
同樣,Order表以uid為key,以orderid和表的標記位(這里表Order的標記位記為2)為值進行Map操作,把表中的記錄轉換生成一系列KV對的形式;
接著,在Shuffle階段,把User表和Order表生成的KV對按鍵值進行Hash,然后傳送給對應的Reduce機器執行。比如KV對(1,《1,Lily》)、(1,《2,101》)、(1,《2,102》)傳送到同一臺Reduce機器上。當Reduce機器接收到這些KV對時,還需按表的標記位對這些鍵值對進行排序,以優化連接操作;
最后,在Reduce階段,對同一臺Reduce機器上的鍵值對,根據“值”(value)中的表標記位,對來自表User和Order的數據進行笛卡爾積連接操作,以生成最終的結果。比如鍵值對(1,《1,Lily》)與鍵值對(1,《2,101》)、(1,《2,102》)的連接結果是(Lily,101)、(Lily,102)。
1.2用MR實現分組操作
假設分數表Score(rank,level),具有rank(排名)和level(級別)兩個屬性,需要進行一個分組(GroupBy)操作,功能是把表Score的不同片段按照rank和level的組合值進行合并,并計算不同的組合值有幾條記錄。SQL語句命令如下:
SELECT rank,level,count(*) as value FROM score GROUP BY rank,level;
圖用MapReduce實現分組操作的實現原理
上圖描述分組操作轉化為MapReduce任務的具體執行過程。
首先,在Map階段,對表Score進行Map操作,生成一系列KV對,其鍵為《rank,level》,值為“擁有該《rank,level》組合值的記錄的條數”。比如,Score表的第一片段中有兩條記錄(A,1),所以進行Map操作后,轉化為鍵值對(《A,1》,2);
接著在Shuffle階段,對Score表生成的鍵值對,按照“鍵”的值進行Hash,然后根據Hash結果傳送給對應的Reduce機器去執行。比如,鍵值對(《A,1》,2)、(《A,1》,1)傳送到同一臺Reduce機器上,鍵值對(《B,2》,1)傳送另一Reduce機器上。然后,Reduce機器對接收到的這些鍵值對,按“鍵”的值進行排序;
在Reduce階段,把具有相同鍵的所有鍵值對的“值”進行累加,生成分組的最終結果。比如,在同一臺Reduce機器上的鍵值對(《A,1》,2)和(《A,1》,1)Reduce操作后的輸出結果為(A,1,3)。
2、Hive中SQL查詢轉換成MR作業的過程
當Hive接收到一條HQL語句后,需要與Hadoop交互工作來完成該操作。HQL首先進入驅動模塊,由驅動模塊中的編譯器解析編譯,并由優化器對該操作進行優化計算,然后交給執行器去執行。執行器通常啟動一個或多個MR任務,有時也不啟動(如SELECT*FROMtb1,全表掃描,不存在投影和選擇操作)
上圖是Hive把HQL語句轉化成MR任務進行執行的詳細過程。
由驅動模塊中的編譯器–Antlr語言識別工具,對用戶輸入的SQL語句進行詞法和語法解析,將HQL語句轉換成抽象語法樹(ASTTree)的形式;
遍歷抽象語法樹,轉化成QueryBlock查詢單元。因為AST結構復雜,不方便直接翻譯成MR算法程序。其中QueryBlock是一條最基本的SQL語法組成單元,包括輸入源、計算過程、和輸入三個部分;
遍歷QueryBlock,生成OperatorTree(操作樹),OperatorTree由很多邏輯操作符組成,如TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator和ReduceSinkOperator等。這些邏輯操作符可在Map、Reduce階段完成某一特定操作;
Hive驅動模塊中的邏輯優化器對OperatorTree進行優化,變換OperatorTree的形式,合并多余的操作符,減少MR任務數、以及Shuffle階段的數據量;
遍歷優化后的OperatorTree,根據OperatorTree中的邏輯操作符生成需要執行的MR任務;
啟動Hive驅動模塊中的物理優化器,對生成的MR任務進行優化,生成最終的MR任務執行計劃;
最后,有Hive驅動模塊中的執行器,對最終的MR任務執行輸出。
Hive驅動模塊中的執行器執行最終的MR任務時,Hive本身不會生成MR算法程序。它通過一個表示“Job執行計劃”的XML文件,來驅動內置的、原生的Mapper和Reducer模塊。Hive通過和JobTracker通信來初始化MR任務,而不需直接部署在JobTracker所在管理節點上執行。通常在大型集群中,會有專門的網關機來部署Hive工具,這些網關機的作用主要是遠程操作和管理節點上的JobTracker通信來執行任務。Hive要處理的數據文件常存儲在HDFS上,HDFS由名稱節點(NameNode)來管理。
JobTracker/TaskTracker
NameNode/DataNode
六、HiveHA基本原理
在實際應用中,Hive也暴露出不穩定的問題,在極少數情況下,會出現端口不響應或進程丟失問題。HiveHA(HighAvailablity)可以解決這類問題。
在HiveHA中,在Hadoop集群上構建的數據倉庫是由多個Hive實例進行管理的,這些Hive實例被納入到一個資源池中,由HAProxy提供統一的對外接口。客戶端的查詢請求,首先訪問HAProxy,由HAProxy對訪問請求進行轉發。HAProxy收到請求后,會輪詢資源池中可用的Hive實例,執行邏輯可用性測試。
如果某個Hive實例邏輯可用,就會把客戶端的訪問請求轉發到Hive實例上;
如果某個實例不可用,就把它放入黑名單,并繼續從資源池中取出下一個Hive實例進行邏輯可用性測試。
對于黑名單中的Hive,HiveHA會每隔一段時間進行統一處理,首先嘗試重啟該Hive實例,如果重啟成功,就再次把它放入資源池中。
由于HAProxy提供統一的對外訪問接口,因此,對于程序開發人員來說,可把它看成一臺超強“Hive”。
七、Impala
1、Impala簡介
Impala由Cloudera公司開發,提供SQL語義,可查詢存儲在Hadoop和HBase上的PB級海量數據。Hive也提供SQL語義,但底層執行任務仍借助于MR,實時性不好,查詢延遲較高。
Impala作為新一代開源大數據分析引擎,最初參照Dremel(由Google開發的交互式數據分析系統),支持實時計算,提供與Hive類似的功能,在性能上高出Hive3~30倍。Impala可能會超過Hive的使用率能成為Hadoop上最流行的實時計算平臺。Impala采用與商用并行關系數據庫類似的分布式查詢引擎,可直接從HDFS、HBase中用SQL語句查詢數據,不需把SQL語句轉換成MR任務,降低延遲,可很好地滿足實時查詢需求。
Impala不能替換Hive,可提供一個統一的平臺用于實時查詢。Impala的運行依賴于Hive的元數據(Metastore)。Impala和Hive采用相同的SQL語法、ODBC驅動程序和用戶接口,可統一部署Hive和Impala等分析工具,同時支持批處理和實時查詢。
2、Impala系統架構

圖Impala系統架構
上圖是Impala系統結構圖,虛線模塊數據Impala組件。Impala和Hive、HDFS、HBase統一部署在Hadoop平臺上。Impala由Impalad、StateStore和CLI三部分組成。
Implalad:是Impala的一個進程,負責協調客戶端提供的查詢執行,給其他Impalad分配任務,以及收集其他Impalad的執行結果進行匯總。Impalad也會執行其他Impalad給其分配的任務,主要是對本地HDFS和HBase里的部分數據進行操作。Impalad進程主要含QueryPlanner、QueryCoordinator和QueryExecEngine三個模塊,與HDFS的數據節點(HDFSDataNode)運行在同一節點上,且完全分布運行在MPP(大規模并行處理系統)架構上。
StateStore:收集分布在集群上各個Impalad進程的資源信息,用于查詢的調度,它會創建一個statestored進程,來跟蹤集群中的Impalad的健康狀態及位置信息。statestored進程通過創建多個線程來處理Impalad的注冊訂閱以及與多個Impalad保持心跳連接,此外,各Impalad都會緩存一份StateStore中的信息。當StateStore離線后,Impalad一旦發現StateStore處于離線狀態時,就會進入恢復模式,并進行返回注冊。當StateStore重新加入集群后,自動恢復正常,更新緩存數據。
CLI:CLI給用戶提供了執行查詢的命令行工具。Impala還提供了Hue、JDBC及ODBC使用接口。
3、Impala查詢執行過程

圖Impala查詢執行過程
注冊和訂閱。當用戶提交查詢前,Impala先創建一個Impalad進程來負責協調客戶端提交的查詢,該進程會向StateStore提交注冊訂閱信息,StateStore會創建一個statestored進程,statestored進程通過創建多個線程來處理Impalad的注冊訂閱信息。
提交查詢。通過CLI提交一個查詢到Impalad進程,Impalad的QueryPlanner對SQL語句解析,生成解析樹;Planner將解析樹變成若干PlanFragment,發送到QueryCoordinator。其中PlanFragment由PlanNode組成,能被分發到單獨的節點上執行,每個PlanNode表示一個關系操作和對其執行優化需要的信息。
獲取元數據與數據地址。QueryCoordinator從MySQL元數據庫中獲取元數據(即查詢需要用到哪些數據),從HDFS的名稱節點中獲取數據地址(即數據被保存到哪個數據節點上),從而得到存儲這個查詢相關數據的所有數據節點。
分發查詢任務。QueryCoordinator初始化相應的Impalad上的任務,即把查詢任務分配給所有存儲這個查詢相關數據的數據節點。
匯聚結果。QueryExecutor通過流式交換中間輸出,并由QueryCoordinator匯聚來自各個Impalad的結果。
返回結果。QueryCoordinator把匯總后的結果返回給CLI客戶端。
4、Impala與Hive

圖Impala與Hive的對比
不同點:
Hive適合長時間批處理查詢分析;而Impala適合進行交互式SQL查詢。
Hive依賴于MR計算框架,執行計劃組合成管道型MR任務模型進行執行;而Impala則把執行計劃表現為一棵完整的執行計劃樹,可更自然地分發執行計劃到各個Impalad執行查詢。
Hive在執行過程中,若內存放不下所有數據,則會使用外存,以保證查詢能夠順利執行完成;而Impala在遇到內存放不下數據時,不會利用外存,所以Impala處理查詢時會受到一定的限制。
相同點:
使用相同的存儲數據池,都支持把數據存儲在HDFS和HBase中,其中HDFS支持存儲TEXT、RCFILE、PARQUET、AVRO、ETC等格式的數據,HBase存儲表中記錄。
使用相同的元數據。
對SQL的解析處理比較類似,都是通過詞法分析生成執行計劃。
-
數據倉庫
+關注
關注
0文章
61瀏覽量
10616 -
Hadoop
+關注
關注
1文章
90瀏覽量
16298 -
hive
+關注
關注
0文章
12瀏覽量
3954
發布評論請先 登錄
什么是數據倉庫?數據倉庫的優勢分析

多版本數據倉庫模型設計
統計行業數據倉庫構建及應用
OLAP在電信數據倉庫中的設計
保護MySQL數據倉庫的最佳實踐
數據倉庫是什么_數據倉庫有什么特點_數據庫和數據倉庫區別分析

評論