1 Hive概述
1.1 什么是Hive
Hive是一款建立在之上的開源數據倉庫系統,可以將存儲在文件中的結構化、半結構化數據文件映射為一張數據庫表,基于表提供了一種類似SQL的查詢模型,稱為Hive查詢語言(HQL),用于訪問和分析存儲在文件中的大型數據集。
Hive核心是將HQL轉換為程序,然后將程序提交到群集執行。Hive由實現并開源。
1.2 為什么使用Hive
使用 直接處理數據所面臨的問題:
人員學習成本太高 需要掌握java語言
實現復雜查詢邏輯開發難度太大
使用Hive處理數據的好處:
操作接口采用類SQL語法,提供快速開發的能力(簡單、容易上手)
避免直接寫,減少開發人員的學習成本
支持自定義函數,功能擴展很方便
背靠,擅長存儲分析海量數據集
1.3 Hive與的關系
從功能來說,數據倉庫軟件,至少需要具備下述兩種能力:
Hive作為一款大數據時代的數據倉庫軟件,當然也具備上述兩種能力。只不過Hive并不是自己實現了上述兩種能力,而是借助。
Hive利用HDFS存儲數據,利用查詢分析數據。
這樣突然發現Hive沒啥用,不過是套殼罷了。其實不然,Hive的最大的魅力在于用戶專注于編寫HQLhive元數據是管理,Hive幫您轉換成為程序完成對數據的分析。
2 場景設計:如何模擬實現Hive的功能
2.1 場景需求
在HDFS文件系統上有一個文件,路徑為/data/.txthive元數據是管理,其內容如下:
1,zhangsan,18,beijing
2,lisi,25,shanghai
3,allen,30,shanghai
4,wangwu,15,nanjing
5,james,45,hangzhou
6,tony,26,beijing
需求:統計來自于上海年齡大于25歲的用戶有多少個?
如果讓您設計Hive這款軟件,要求能夠實現用戶編寫sql語句,Hive自動將sql轉換程序,處理位于HDFS上的結構化數據。如何實現?
2.2 場景目的
重點理解下面兩點:
Hive能將數據文件映射成為一張表,這個映射是指什么?
Hive軟件本身到底承擔了什么功能職責?
2.3 功能實現關鍵
映射信息記錄
映射在數學上稱之為一種對應關系,比如y=x+1,對于每一個x的值都有與之對應的y的值。在hive中能夠寫sql處理的前提是針對表,而不是針對文件,因此需要將文件和表之間的對應關系描述記錄清楚。映射信息專業的叫法稱之為元數據信息(元數據是指用來描述數據的數據 )。
具體來看,要記錄的元數據信息包括:
Sql語法解析、編譯
用戶寫完sql之后,hive需要針對sql進行語法校驗,并且根據記錄的元數據信息解讀sql背后的含義,制定執行計劃。并且把執行計劃轉換成程序來執行,把執行的結果封裝返回給用戶。
2.4 最終效果
基于上述分析,最終要想模擬實現的Hive的功能,大致需要下圖所示組件參與其中,從中可以感受一下Hive承擔了什么職責。
當然,也可以把這個理解為hive的架構圖。
3 Hive架構、組件
3.1 Hive架構圖
3.2 Hive組件
用戶接口:包括 CLI、JDBC/ODBC、。其中,CLI( line )為shell命令行;Hive中的服務器允許外部客戶端通過網絡與Hive進行交互,類似于JDBC或ODBC協議。是通過瀏覽器訪問Hive。
元數據存儲:通常是存儲在關系數據庫如 mysql/derby中。Hive 中的元數據包括表的名字,表的列和分區及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。
驅動程序,包括語法解析器、計劃編譯器、優化器、執行器:完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在 HDFS 中,并在隨后有執行引擎調用執行。
執行引擎:Hive本身并不直接處理數據文件。而是通過執行引擎處理。當下Hive支持、Tez、種執行引擎。
4 Hive數據模型(Data Model)
數據模型:用來描述數據、組織數據和對數據進行操作,是對現實世界數據特征的描述。Hive的數據模型類似于RDBMS庫表結構,此外還有自己特有模型。
Hive中的數據可以在粒度級別上分為三類:
4.1
Hive作為一個數據倉庫,在結構上積極向傳統數據庫看齊,也分數據庫(),每個數據庫下面有各自的表組成。默認數據庫。
Hive的數據都是存儲在HDFS上的,默認有一個根目錄,在hive-site.xml中,由參數hive...dir指定。默認值為/user/hive/。
因此,Hive中的數據庫在HDFS上的存儲路徑為:
${hive.metastore.warehouse.dir}/databasename.db
比如,名為的數據庫存儲路徑為:
/user/hive/warehouse/handsome.db
4.2
Hive表與關系數據庫中的表相同。Hive中的表所對應的數據是存儲在的文件系統中,而表相關的元數據是存儲在RDBMS中。
在中,數據通常駐留在HDFS中,盡管它可以駐留在任何文件系統中,包括本地文件系統或S3。Hive有兩種類型的表:
創建表時,默是內部表。關于內部表和外部表的區別,我們后續知識點再做展開探討。Hive中的表的數據在HDFS上的存儲路徑為:
${hive.metastore.warehouse.dir}/databasename.db/tablename
比如,的數據庫下表存儲路徑為:
/user/hive/warehouse/handsome.db/t_user
4.3
分區是hive的一種優化手段表。分區是指根據分區列(例如“日期day”)的值將表劃分為不同分區。這樣可以更快地對指定分區數據進行查詢。
分區在存儲層面上的表現是:table表目錄下以子文件夾形式存在。
一個文件夾表示一個分區。子文件命名標準:分區列=分區值
Hive還支持分區下繼續創建分區,所謂的多重分區。關于分區表的使用和詳細介紹,后面模塊會單獨展開詳細講解。
4.4
分桶表是hive的一種優化手段表。分桶是指根據表中字段(例如“編號ID”)的值,經過hash計算規則將數據文件劃分成指定的若干個小文件。
分桶規則:(ID) % 桶個數,余數相同的分到同一個文件。
分桶的好處是可以優化join查詢和方便抽樣查詢。分桶表在hdfs中表現為同一個表目錄下數據根據hash散列之后變成多個文件。關于桶表以及分桶操作,后面模塊會單獨展開詳細講解。
5 Hive是要取代Mysql嗎?
Hive雖然具有RDBMS數據庫的外表,包括數據模型、SQL語法都十分相似,但應用場景卻完全不同。Hive只適合用來做海量數據的離線分析。Hive的定位是數據倉庫,面向分析的OLAP系統。
因此時刻告訴自己,Hive不是大型數據庫,也不是要取代Mysql承擔業務數據處理。
更直觀的對比請看下面這幅圖: