Hive 初識

HIve是什麼?

Hive是一個基於Hadoop的數據倉庫工具,提供了方便查詢和管理海量數據的能力,它可以把結構化的數據文件轉化爲一張數據庫表,並存儲在HDFS上(也可以存儲在本地磁盤上),用戶可以通過自定義的SQL語句來查詢存儲在HDFS上的數據。具有高延遲性,適合用於海量數據的統計分析。

它是怎麼通過SQL查詢HDFS上的數據的?

通過SQL查詢HDFS上的數據,需要將SQL轉爲相應的MR程序來執行計算。它是怎麼將SQL轉化爲MR成的呢?

客戶端通過接口(JDBC、ODBC、Thrift)提交SQL語句給Hive,Hive服務端接收到SQL後,會先對SQL語句進行解析,解析時會從Metastore中獲取相關的元數據信息(包括表的名稱、表的列、分區、索引、是否爲外部表、表的數據所在目錄等)做語法、語義檢查,優化等,生成執行計劃,然後根據執行計劃創建相應的Job,並把這些Job提交給JobTracker執行,在提交Job時,還要提取元數據信息關聯的具體數據,這些元數據信息也會被髮送到namenode節點。然後JobTracker將Job拆分爲多個Task來執行,並將執行結果返回或寫入HDFS中。 

它的數據是怎麼存儲的?

Hive中的數據都是存儲在HDFS上的,沒有固定的存儲格式,用戶可以根據數據源的格式來自定義Hive表中數據的存儲格式,只需在創建表時指定行的分隔符和列的分隔符即可,如果有複雜類型的集合(array、map、strut),還需要爲每個集合類型指定相應的分隔符。這樣,在查詢時,Hive就可以根據每個列的存儲格式來解析數據。

Hive的數據模型主要有:數據庫(Database)、表(Table)、分區(Partition)、桶(Bucket)

Database:在Hive中,Database本質上就是就一個文件目錄或一個命名空間,用於組織表。對於一個多團隊和多用戶的大集羣來說,可以避免不同數據庫之間表名的衝突問題。

Table:Hive的Table是Database目錄下的一個子目錄,一個Table對應一個目錄,表中的數據都存放在該目錄下。表分爲內部表(Managed Table)和外部表(External Table),兩者的區別爲外部表不受Hive管理,即外部表的數據不會被存儲到數據倉庫的目錄下,在刪除表時,對於外部表只是刪除與其相關的元數據信息,而表的數據不會被刪除,對於內部表,表數據和相關元數據都會被刪除。

PatItion:每一個的Partition爲表目錄下的一個子目錄,每個分區的數據放在其分區目錄下。

Bucket:就是對指定列計算hash值,根據hash值切分數據,每一個Bucket對應一個文件。使用Bucket可以提高並行查詢的能力。將 user 列分散至 32 個 bucket,首先對 user 列的值計算 hash,對應 hash 值爲 0 的 HDFS 目錄爲:/wh/pvs/ds=20090801/ctry=US/part-00000;hash 值爲 20 的 HDFS 目錄爲:/wh/pvs/ds=20090801/ctry=US/part-00020。

Hive的體系結構

用戶接口:CLI、Thrift、HWI

CLI:是一個和Hive通過命令行交互的接口。

HWI(Hive Web Interface):Web接口,可以通過瀏覽器訪問Hive。

Thrift:提供了可以從不同編程語言編寫的客戶端訪問Hive的接口,支持身份驗證和多用戶併發訪問。

Metastore

用於存儲Hive表的元數據信息,包括表的名稱、列名、分區、索引、是否爲外部表,以及表的數據所在目錄等。默認它是和Hive Server運行在同一JVM中,幷包含一個嵌套的Derby數據庫。但是在同一時刻,只能有一個Hive會話訪問Derby數據庫,所以通常是使用MySQL數據庫來存儲元數據信息。

驅動(Driver):編譯器、優化器、執行器

用戶提交SQL給HIve,由Driver負責解析SQL,在解析時會加載相關的元數據信息,生成執行計劃,然後生成Job交給Hadoop運行,然後Driver將結果返回給用戶。

編譯器:Hive的核心,負責SQL語句的語法、語義解析,生成查詢計劃。

1、語義解析器(ParseDriver),將查詢字符串轉換成解析樹表達式;

2、語法解析器(SemanticAnalyzer),將解析樹轉換成基於語句塊的內部查詢表達式;

3、邏輯計劃生成器(Logical Plan Generator),將內部查詢表達式轉換爲邏輯計劃,這些計劃由邏輯操作樹組成,操作符是Hive的最小處理單元,每個操作符處理代表一      道HDFS操作或者是MR作業;

4、查詢計劃生成器(QueryPlan Generator),將邏輯計劃轉化成物理計劃(MR Job)。

生成的查詢計劃存儲在 HDFS 中,並在隨後由 MapReduce 調用執行

優化器:優化器是一個演化組件,當前它的規則是:列修剪,謂詞下壓。

執行器:編譯器將操作樹切分成一個Job鏈(DAG),執行器會順序執行其中所有的Job;如果Task鏈不存在依賴關係,可以採用併發執行的方式進行Job的執行。

Hadoop

Hive的數據是存儲在HDFS上的,表的一個分區對應表目錄下的一個子目錄,每個桶(Bucket)對應表目錄下的一個文件。

Hive和數據庫的對比:

兩者的使用場景不同:Hive適用於離線的數據分析,而數據庫適用於在線聯機的事務處理。
1、使用的查詢語言:Hive使用了一個類似Sql的查詢語言Hql
2、數據存儲的位置:Hive是建立在Hadoop之上的,它的數據都是存儲在HDFS上的。而數據庫的數據則是存儲在本地文件系統中,或是塊設備中。
3、數據格式:Hive並沒有定義嚴格的數據格式,在數據加載的過程中,也不對數據格式校驗,只是將數據內容複製或移動到相應的HDFS目錄中。而數據庫,不同的數據庫則有不同的數據存儲引擎,存儲的數據格式也不相同,且數據是按嚴格的格式存儲的,所以,在加載數據的過程會比較耗時。
4、數據的更新:Hive是針對數據倉庫設計的,一般是讀多寫少,所以Hive並不支持數據的更新操作,所有的數據在加載時就確定好的。而數據庫中的數據則是經常需要更新的。
5、索引、事務:由於Hive在加載時不對數據做任何處理,也不會對任何字段建立索引,但由於MarReduce的並行訪問數據,因此即使沒有索引,對於大數據量的訪問,Hive還是可以體現出其優勢的。
6、執行:Hive大多數的查詢時通過Hadoop的MapReduce來實現的,而數據庫則是由其執行引擎執行的。
7、延遲性:Hive具有較高的延遲性,而數據庫的延遲較低。

HIve優缺點

優點:Hive作爲一個基於Hadoop的數據倉庫工具,提供了簡單的SQL查詢功能,簡化了MapReduce的編寫操作,適用於大數據集的批處理作業,例如,網絡日誌分析。

缺點:Hive的HQL表達能力有限,對於較複雜的運算HQL不易表達;另外,Hive具有高延遲性,不適合那些低延遲的應用,如:OLTP系統。它不提供實時的查詢和基於行級的數據更新操作,




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章