Hive一文深入淺出
本文來源:http://r6d.cn/bemp7
Hive概述
數(shù)據(jù)倉庫的概念:
數(shù)據(jù)倉庫(Data Warehouse)是一個面向主題的(Subject Oriented)、集成的(Integrated)、相對穩(wěn)定的(Non-Volatile)、反映歷史變化(Time Variant)的數(shù)據(jù)集合,用于支持管理決策。
傳統(tǒng)數(shù)據(jù)倉庫面臨的挑戰(zhàn):
無法滿足快速增長的海量數(shù)據(jù)存儲需求。 無法有效處理不同類型的數(shù)據(jù)。 計算和處理能力不足。
Hive簡介:
Hive是一個構(gòu)建于Hadoop頂層的數(shù)據(jù)倉庫工具,可以查詢和管理PB級別的分布式數(shù)據(jù)。 支持大規(guī)模數(shù)據(jù)存儲、分析,具有良好的可擴展性 某種程度上可以看作是用戶編程接口,本身不存儲和處理數(shù)據(jù)。 依賴分布式文件系統(tǒng)HDFS存儲數(shù)據(jù)。 依賴分布式并行計算模型MapReduce處理數(shù)據(jù)。 定義了簡單的類似SQL 的查詢語言——HiveQL。 用戶可以通過編寫的HiveQL語句運行MapReduce任務。 可以很容易把原來構(gòu)建在關(guān)系數(shù)據(jù)庫上的數(shù)據(jù)倉庫應用程序移植到Hadoop平臺上。 是一個可以提供有效、合理、直觀組織和使用數(shù)據(jù)的分析工具。
Hive具有的特點非常適用于數(shù)據(jù)倉庫。
(1)采用批處理方式處理海量數(shù)據(jù)
Hive需要把HiveQL語句轉(zhuǎn)換成MapReduce任務進行運行。 數(shù)據(jù)倉庫存儲的是靜態(tài)數(shù)據(jù),對靜態(tài)數(shù)據(jù)的分析適合采用批處理方式,不需要快速響應給出結(jié)果,而且數(shù)據(jù)本身也不會頻繁變化。
(2)提供適合數(shù)據(jù)倉庫操作的工具
Hive本身提供了一系列對數(shù)據(jù)進行提取、轉(zhuǎn)換、加載(ETL)的工具,可以存儲、查詢和分析存儲在Hadoop中的大規(guī)模數(shù)據(jù)。 這些工具能夠很好地滿足數(shù)據(jù)倉庫各種應用場景。
(3)支持MapReduce,Tez,Spark等多種計算引擎。
(4)可以直接訪問HDFS文件以及HBase。
(5)易用易編程。
Hive與Hadoop生態(tài)系統(tǒng)中其他組件的關(guān)系:

圖:Hadoop生態(tài)系統(tǒng)
Hive依賴于HDFS 存儲數(shù)據(jù) Hive依賴于MapReduce 處理數(shù)據(jù) 在某些場景下Pig可以作為Hive的替代工具 HBase 提供數(shù)據(jù)的實時訪問
Hive的優(yōu)缺點:
Hive的優(yōu)點:
高可靠、高容錯:HiveServer采用集群模式。雙MetaStor。超時重試機制。 類SQL:類似SQL語法,內(nèi)置大量函數(shù)。 可擴展:自定義存儲格式,自定義函數(shù)。 多接口:Beeline,JDBC,ODBC,Python,Thrift。
Hive的缺點:
延遲較高:默認MR為執(zhí)行引擎,MR延遲較高。 不支持霧化視圖:Hive支持普通視圖,不支持霧化視圖。Hive不能再視圖上更新、插入、刪除數(shù)據(jù)。 不適用OLTP:暫不支持列級別的數(shù)據(jù)添加、更新、刪除操作。 暫不支持存儲過程:當前版本不支持存儲過程,只能通過UDF來實現(xiàn)一些邏輯處理。
Hive與傳統(tǒng)數(shù)據(jù)庫的對比分析:
Hive在很多方面和傳統(tǒng)的關(guān)系數(shù)據(jù)庫類似,但是它的底層依賴的是HDFS和MapReduce,所以在很多方面又有別于傳統(tǒng)數(shù)據(jù)庫。


Hive在企業(yè)中的部署和作用:
Hive在企業(yè)大數(shù)據(jù)分析平臺中的應用:

圖:企業(yè)中一種常見的大數(shù)據(jù)分析平臺部署框架
Hive在Facebook公司中的應用:
基于Oracle的數(shù)據(jù)倉庫系統(tǒng)已經(jīng)無法滿足激增的業(yè)務需求 Facebook公司開發(fā)了數(shù)據(jù)倉庫工具Hive,并在企業(yè)內(nèi)部進行了大量部署
Hive在FusionInsight中的位置:

圖:Hive在FusionInsight中的位置
Hive是一種數(shù)據(jù)倉庫處理工具,使用類SQL的HiveQL語言實現(xiàn)數(shù)據(jù)查詢功能,所有的Hive數(shù)據(jù)都存儲在HDFS中。
Hive應用場景:
數(shù)據(jù)挖掘:用戶行為分析;興趣分區(qū);區(qū)域展示; 非實時分析:日志分析;文本分析。 數(shù)據(jù)匯總:每天/每周用戶點擊數(shù),流量統(tǒng)計。 數(shù)據(jù)倉庫:數(shù)據(jù)抽取,加載,轉(zhuǎn)換(ETL)。
Hive功能與架構(gòu)
Hive系統(tǒng)架構(gòu):


圖:Hive系統(tǒng)架構(gòu)
用戶接口模塊包括CLI、HWI、JDBC、ODBC、Thrift Server。
驅(qū)動模塊(Driver)包括編譯器、優(yōu)化器、執(zhí)行器等,負責把HiveSQL語句轉(zhuǎn)換成一系列MapReduce作業(yè)。
元數(shù)據(jù)存儲模塊(Metastore)是一個獨立的關(guān)系型數(shù)據(jù)庫(自帶derby數(shù)據(jù)庫,或MySQL數(shù)據(jù)庫)。
FusionInsight HD中Hive的架構(gòu):

圖:FusionInsight中Hive的架構(gòu)
Hive分為三個角色:HiveServer、MetaStore、WebHcat。
HiveServer:將用戶提交的HQL語句進行編譯,解析成對應的Yarn任務,Spark任務或者HDFS操作,從而完成數(shù)據(jù)的提取,轉(zhuǎn)換,分析。 MetaStroe:提供元數(shù)據(jù)服務。 WebHcat:對外提供基于Htpps洗衣的元數(shù)據(jù)訪問、DDL查詢等服務。
HCatalog架構(gòu):

圖:HCatalog架構(gòu)
HCatalog包括Hcatalog Client和Hcatalog Server:
HCatalog CLient包括命令行工具CLI和Clent jar包(用于給Pig, MR提供元數(shù)據(jù)讀寫支持)。 HCatalog通過Hive提供的HiveMetaStoreClent對象來間接訪問MetaStore。 HCatalog對外提供Hcatloader,HCatinputFormat來讀取數(shù)據(jù);提供HCatStore,HCatOutputFormat來寫入數(shù)據(jù)。
WebHCat架構(gòu):

圖:WebHCat架構(gòu)
WebHCat提供Rest接口,是用戶能夠通過安全的HTTPS協(xié)議執(zhí)行以下操作:
執(zhí)行Hive DDL操作。 運行Hive HQL任務。 運行MapReduce任務。
Hive數(shù)據(jù)存儲模型:

圖:Hive數(shù)據(jù)存儲模型
分區(qū):數(shù)據(jù)表可以按照某個字段的值劃分分區(qū)。
每個分區(qū)是一個目錄。 分區(qū)數(shù)量不固定。 分區(qū)下可再有分區(qū)或者桶。
桶:數(shù)據(jù)可以根據(jù)桶的方式將不同數(shù)據(jù)放入不同的桶中。
每個桶是一個文件。 建表時指定桶個數(shù),桶內(nèi)可排序。 數(shù)據(jù)按照某個字段的值Hash后放入某個桶中。
Hive可以創(chuàng)建托管表和外部表:
默認創(chuàng)建托管表,Hiva會將數(shù)據(jù)移動到數(shù)據(jù)倉庫的目錄。 創(chuàng)建外部表,這時Hiva會到倉庫目錄以外的位置訪問數(shù)據(jù)。 如果所有處理都由Hive完成,建議使用托管表。 如果要用Hive和其他工具來處理同一個數(shù)據(jù)集,建議使用外部表。 
區(qū)別
Hive支持的函數(shù):
Hive內(nèi)置函數(shù):
數(shù)據(jù)函數(shù):如round(),fllor(), abs(), rand()等。 日期函數(shù):如to_date(), month(), day(). 字符串函數(shù),如trim(), length(), substr()等。
UDF(User-Defined Funcation)用戶自定義函數(shù)。
Hive工作原理:
(1)SQL語句轉(zhuǎn)換成MapReduce作業(yè)的基本原理:

圖:join的實現(xiàn)原理

圖:group by實現(xiàn)原理
存在一個分組(Group By)操作,其功能是把表Score的不同片段按照rank和level的組合值進行合并,計算不同rank和level的組和值分別有幾條記錄。
(2)Hive中SQL查詢轉(zhuǎn)換成MapReduce作用的過程:
當用戶向Hive輸入一段命令或查詢時,Hive需要與Hadoop交互工作來完成該操作:
驅(qū)動模塊接收該命令或查詢編譯器 對該命令或查詢進行解析編譯 由優(yōu)化器對該命令或查詢進行優(yōu)化計算 該命令或查詢通過執(zhí)行器進行執(zhí)行
詳細如果如下:

圖:SQL查詢轉(zhuǎn)換成MapReduce作業(yè)的過程
第1步:由Hive驅(qū)動模塊中的編譯器對用戶輸入的SQL語言進行詞法和語法解析,將SQL語句轉(zhuǎn)化為抽象語法樹的形式。 第2步:抽象語法樹的結(jié)構(gòu)仍很復雜,不方便直接翻譯為MapReduce算法程序,因此,把抽象語法書轉(zhuǎn)化為查詢塊。 第3步:把查詢塊轉(zhuǎn)換成邏輯查詢計劃,里面包含了許多邏輯操作符。 第4步:重寫邏輯查詢計劃,進行優(yōu)化,合并多余操作,減少MapReduce任務數(shù)量。 第5步:將邏輯操作符轉(zhuǎn)換成需要執(zhí)行的具體MapReduce任務。 第6步:對生成的MapReduce任務進行優(yōu)化,生成最終的MapReduce任務執(zhí)行計劃。 第7步:由Hive驅(qū)動模塊中的執(zhí)行器,對最終的MapReduce任務進行執(zhí)行輸出。
幾點說明:
當啟動MapReduce程序時,Hive本身是不會生成MapReduce算法程序的。 需要通過一個表示“Job執(zhí)行計劃”的XML文件驅(qū)動執(zhí)行內(nèi)置的、原生的Mapper和Reducer模塊。 Hive通過和JobTracker通信來初始化MapReduce任務,不必直接部署在JobTracker所在的管理節(jié)點上執(zhí)行。 通常在大型集群上,會有專門的網(wǎng)關(guān)機來部署Hive工具。網(wǎng)關(guān)機的作用主要是遠程操作和管理節(jié)點上的JobTracker通信來執(zhí)行任務。 數(shù)據(jù)文件通常存儲在HDFS上,HDFS由名稱節(jié)點管理。
#Hive增強特性
Hive增強特性-Colocation:
Colocation(同分布):將存在關(guān)聯(lián)關(guān)系的數(shù)據(jù)或可能進行管理操作的數(shù)據(jù)存儲在相同的存儲節(jié)點上。
文件級同分布實現(xiàn)文件的快速訪問,避免了因數(shù)據(jù)搬遷帶來的大量網(wǎng)絡開銷。
Hive增強特性–Hbase記錄批量刪除:
在Hive on HBase功能匯總,F(xiàn)usionInsight HD Hive提供了對HBase表的單條數(shù)據(jù)的刪除功能,通過特定的語法,Hive可以將HBase表中符合條件的一條或多條數(shù)據(jù)批量清除。
Hive增強特性–流控特性:
通過流控特性,可以實現(xiàn):
當前已經(jīng)建立連接數(shù)據(jù)閾值控制。 每個用戶已經(jīng)建立的連接數(shù)閾值控制。 單位時間內(nèi)所有建立的連接數(shù)閾值控制。
