Hive系列(一)Hive基本概念
一、Hive基本概念
1.1 什麼是Hive
Hive:由Facebook開源用於解決海量結構化日誌的資料統計。
Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張表,並提供類SQL查詢功能。
本質是:將HQL轉化成MapReduce程式
1)Hive處理的資料儲存在HDFS
2)Hive分析資料底層的實現是MapReduce
3)執行程式執行在YARN上
1.2 為什麼使用Hive
1)直接使用hadoop所面臨的問題
(1)人員學習成本太高
(2)專案週期要求太短
(3)MapReduce實現複雜查詢邏輯開發難度太大
2)Hive的好處
(1)操作介面採用類SQL語法,提供快速開發的能力。
(2)避免了去寫MapReduce,減少開發人員的學習成本。
(3)擴充套件功能很方便。
1.3 Hive架構概述
如圖中所示,Hive通過給使用者提供的一系列互動介面,接收到使用者的指令(SQL),使用自己的Driver,結合元資料(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最後,將執行返回的結果輸出到使用者互動介面。
1)使用者介面:Client
CLI(hive shell)、JDBC/ODBC(java訪問hive)、WEBUI(瀏覽器訪問hive)
2)元資料:Metastore
元資料包括:表名、表所屬的資料庫(預設是default)、表的擁有者、列/分割槽欄位、表的型別(是否是外部表)、表的資料所在目錄等;
預設儲存在自帶的derby資料庫中,推薦使用MySQL儲存Metastore
3)Hadoop
使用HDFS進行儲存,使用MapReduce進行計算。
4)驅動器:Driver
(1)解析器(SQL Parser):將SQL字串轉換成抽象語法樹AST,這一步一般都用第三方工具庫完成,比如antlr;對AST進行語法分析,比如表是否存在、欄位是否存在、SQL語義是否有誤。
(2)編譯器(Physical Plan):將AST編譯生成邏輯執行計劃。
(3)優化器(Query Optimizer):對邏輯執行計劃進行優化。
(4)執行器(Execution):把邏輯執行計劃轉換成可以執行的物理計劃。對於Hive來說,就是MR/TEZ/Spark。
1.4 Hive 的特點
1)操作介面採用類SQL語法,提供快速開發的能力(簡單、容易上手)
2)避免了去寫MapReduce,減少開發人員的學習成本。
3)Hive的執行延遲比較高,因此hive常用於資料分析,對實時性要求不高的場合;
4)Hive優勢在於處理大資料,對於處理小資料沒有優勢,因為Hive的執行延遲比較高。
5)Hive支援使用者自定義函式,使用者可以根據自己的需求來實現自己的函式。
1.5 Hive和資料庫比較
由於 Hive 採用了類似SQL 的查詢語言 HQL(hive query language),因此很容易將 Hive 理解為資料庫。其實從結構上來看,Hive 和資料庫除了擁有類似的查詢語言,再無類似之處。本文將從多個方面來闡述 Hive 和資料庫的差異。資料庫可以用在 Online 的應用中,但是Hive 是為資料倉庫而設計的,清楚這一點,有助於從應用角度理解 Hive 的特性。
1.5.1 查詢語言
由於SQL被廣泛的應用在資料倉庫中,因此,專門針對Hive的特性設計了類SQL的查詢語言HQL。熟悉SQL開發的開發者可以很方便的使用Hive進行開發。
1.5.2 資料儲存位置
Hive 是建立在 Hadoop 之上的,所有 Hive 的資料都是儲存在 HDFS 中的。而資料庫則可以將資料儲存在塊裝置或者本地檔案系統中。
1.5.3 資料更新
由於Hive是針對資料倉庫應用設計的,而資料倉庫的內容是讀多寫少的。因此,Hive中不支援對資料的改寫和新增,所有的資料都是在載入的時候中確定好的。而資料庫中的資料通常是需要經常進行修改的,因此可以使用 INSERT INTO … VALUES 新增資料,使用 UPDATE … SET修改資料。
1.5.4 索引
Hive在載入資料的過程中不會對資料進行任何處理,甚至不會對資料進行掃描,因此也沒有對資料中的某些Key建立索引。Hive要訪問資料中滿足條件的特定值時,需要暴力掃描整個資料,因此訪問延遲較高。由於 MapReduce 的引入, Hive 可以並行訪問資料,因此即使沒有索引,對於大資料量的訪問,Hive 仍然可以體現出優勢。資料庫中,通常會針對一個或者幾個列建立索引,因此對於少量的特定條件的資料的訪問,資料庫可以有很高的效率,較低的延遲。由於資料的訪問延遲較高,決定了 Hive 不適合線上資料查詢。
1.5.5 執行
Hive中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的。而資料庫通常有自己的執行引擎。
1.5.6 執行延遲
Hive 在查詢資料的時候,由於沒有索引,需要掃描整個表,因此延遲較高。另外一個導致 Hive 執行延遲高的因素是 MapReduce框架。由於MapReduce 本身具有較高的延遲,因此在利用MapReduce 執行Hive查詢時,也會有較高的延遲。相對的,資料庫的執行延遲較低。當然,這個低是有條件的,即資料規模較小,當資料規模大到超過資料庫的處理能力的時候,Hive的平行計算顯然能體現出優勢。
1.5.7 可擴充套件性
由於Hive是建立在Hadoop之上的,因此Hive的可擴充套件性是和Hadoop的可擴充套件性是一致的(世界上最大的Hadoop 叢集在 Yahoo!,2009年的規模在4000 臺節點左右)。而資料庫由於 ACID 語義的嚴格限制,擴充套件行非常有限。目前最先進的並行資料庫 Oracle 在理論上的擴充套件能力也只有100臺左右。
1.5.8 資料規模
由於Hive建立在叢集上並可以利用MapReduce進行平行計算,因此可以支援很大規模的資料;對應的,資料庫可以支援的資料規模較小。