一、Hive是什麼
要了解Hive是什麼得先了解一下數倉(數據倉庫)的概念,什麼又是數據倉庫呢?
數據倉庫的目的是爲了協助輸出分析報告,支持決策,爲需要業務智能的企業提供業務流程的改進和指導,從而可以節省時間和成本,提高質量。
數據倉庫與數據庫的不同在於,數據庫主要是爲了很好的解決事務問題,實現對數據的增、刪除、改、查,而數據倉庫則主要是用來做查詢分析的數據庫,通常不會做數據的插入、修改、刪除。
Hive作爲數據倉庫工具,非常適合做數據的統計分析。它可以把數據文件組成表格並且有完整的類SQL查詢功能,還可以把這種類SQL的語句自動轉爲MapReduce任務來運行,因而使用它可以提高開發效率。
Hive與傳統的關係數據庫的異同點
Hive與RDBMS的區別
-
關於查詢語句
區別
|
Hive
|
RDBMS
|
查詢語句
|
HQL
|
SQL
|
數據存儲位置 |
HDFS
|
LocalFS
|
數據格式判斷
|
查詢時判斷
|
插入時判斷
|
執行
|
MapReduce
|
Excecutor
|
執行延遲
|
高
|
低
|
處理數據規模
|
大
|
小
|
關於HQL與SQL的比較
特徵
|
HQL |
SQL
|
更新
|
INSERT
|
INSERT、UPATE、DELETE
|
事務
|
有限支持
|
支持 |
索引
|
支持
|
支持
|
延遲
|
分鐘級
|
亞秒級
|
多表插入
|
支持
|
不支持
|
create table as select
|
支持
|
SQL-92中不支持,有些數據庫支持
|
SELECT
|
支持排序sort by。可限制返回行數量的limit
|
SQL-92
|
子查詢
|
只能在From,where或having子句中(不支持查關子查詢)
|
在任何子句中支持“相關”或“不相關”的
|
視圖
|
用戶定義函數
|
可更新
|
擴展
|
MapReduce腳本
|
用戶定義函數
|
-
關於數據存儲位置
數據庫的數據存儲在塊設備或本地文件系統中,而Hive是把所有數據存儲在HDFS中,關建立在Hadoop之上。
-
數據格式
Hive中,沒有特定的數據格式,數據格式是由用戶指定,用戶在定義數據格式是由用戶指定的,定義時需要指定3個屬性:列分隔符(空格、\t、\x001);行分隔符(\n);讀取文件數據的方法,在加載數據時,不需要從用戶數據格式到Hive本身定義的數據格式傳換,所以,在Hive加載過程中不會對數據本身做任何調整,只是把數據內容複製到HDFS目錄中
傳統的數據庫中,由於不同的數據庫有不同的引擎,它們各自定義了自己的數據格式,數據會按一定的組織結構進行存儲,因而在數據庫加載過程中會比較耗時
-
數據更新
Hive是不支持對數據的修改和增加的,所有的數據都在加載過程中完成,而傳統的數據庫常常會進行修改、查詢、增加等操作
-
索引
Hive在加載數據時不會對數據做任何的處理,也不會對數據做掃描處理,所以也沒有對數據中某些鍵值創建索引,在Hive訪問數據中滿足條件的數據時,需要掃描全部數據,因而它的延遲較高,由於HQL最終會轉化成MapReduce,因此可以並行訪問數據,即使在沒有索引的情況下,對於大批量的數據訪問,它仍可以表現出優勢
在傳統數據庫中通常會對某列或某幾例建立索引,所以對於小批量的滿足特定條件的數據訪問,數據庫具有很高的效率,以及較低的延遲。Hive相對來說延遲較高不適合做在線查詢數據
-
執行
Hive的大多數查詢是通過MapReduce來實現的,則數據庫則具有自己的執行引擎
-
執行延遲
Hive有執行的延遲,所以只有當數據規模大到超過數據庫處理能力的時候,Hive的並行計算的優勢纔會體現出來
-
可擴展性
Hive與Hadoop的可擴展性一致,而傳統數據庫由於ACID語義的嚴格限制,擴展性非常有限
-
處理數據規模
Hive建立在集羣之上可以處理的數據規模相比於傳統數據庫要大很多
Hive的運行架構簡介
Hive的用戶接口主要有3個:CLI(Command Line)、Client和WUI,其中CLI是最常用的
在CLI啓動時,一個Hive的副本也會隨之啓動
Client就是Hive的客戶端,在啓動這個客戶端時需要指出Hive Server在哪個節點上,同時在這個節點啓動Hive Server
HWI則是通過瀏覽器來訪問Hive
對於上圖的簡單解釋
MetaStore:主要用來存儲元數據,Hive將元數據存儲在數據庫中(MySql,derby……)。在Hive中元數據包含有:表名稱、表的列和分區及其屬性、表屬性、表所在的目錄……
解釋器、編譯器、優化器完成HQL查詢語句從詞法分析、語法分析、編譯、優化到查詢計劃生成,生成的查詢計劃存儲在HDFS中,並在MapReduce中調用執行。
Hive的數據存儲在HDFS中,大部分的查詢、計算由MapReduce完成
Hive的執行流程
-
用戶提交查詢任務到Driver
-
編譯器獲取用戶的任務計劃
-
編譯器根據用戶任務計劃從MetaStore中獲取需要的元數據信息
-
編譯器對任務進行編譯,先把HQL轉爲抽象語法樹,再把抽象語句塊轉成查詢語句塊,接着把查詢語句塊轉爲邏輯的查詢計劃
-
把最終計劃提交到Driver
-
Driver把計劃提交到Execution Engine,獲取元數據信息,接着提交到JobTracker或SourceManager運行這個任務,任務會直接從HDFS中讀取文件並進行相應的操作
-
獲取返回執行結果
Hive服務介紹
-
CLI服務
CLI是Hive的命令行接口,也就是Shell環境。CLI啓動時會同時啓動一個Hive副本,這也是默認的服務
-
HiveServer服務
通過Thrift提供的服務(默認端口是10000),客戶端可以在不啓動CLI的情況下對Hive中的數據進行操作並且可以使用不同的語言編寫客戶端進行訪問。使用Thrift、JDBC、ODBC連接器的客戶端需要運行Hive服務器來和Hive進行通信
-
HWI服務
同過瀏覽器訪問Hive,默認的端口是9999
-
MetaStore服務
使用這個服務可以讓MetaStore作爲一個單獨的進程來運行。通過設定METASTORE_PORT環境變量可以指定服務器監聽的端口號
元數據存儲——Metastore
它是Hive存放元數據的地方,它包含兩個部分:服務、後臺數據存儲
Hive有三種Metastore的配置方式:內嵌模式、本地模式、遠程模式
內嵌模式:使用內嵌的Derby數據庫來存儲數據,配置簡單,但是一次只能與一個客戶端連接,適用於單元測試,不適用於生產環境
本地模式和遠程模式:都使用外部數據庫來存數據。它們兩者的區別在於本地模式元數據不需要單獨啓動Metastore服務,因爲本地元存儲用的是和本地Hive在同一個進程裏的Metastore服務
內嵌模式(Embedded)
連接到一個In-memory的數據庫Derby,一般是用於做單元測試
本地模式(Local)
通過網絡連接到一個數據庫中,這個是常用的一種模式
遠程模式(Remote)
用於非JAVA客戶端訪問元數據庫,在服務器端會啓動MetaStoreServer,客戶端通過Thrift協議及MetaStoreServer來訪問元數據庫