Hive工具的介紹(一)

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