Hive 是什麼
- 首先是一個構建在Hadoop之上的數據倉庫(它並不是一個真實的數據庫)
- 由Facebook開源,最初用於解決海量結構化的日誌數據統計問題
- Hive定義了一種類似於SQL查詢語言:HQL(非常類似於MySQL中的SQL語句,同時做了擴展)
- 通常用於離線數據處理(採用MapReduce)
- 可以認爲是一個HQL=>MapReduce的語言翻譯器
- 底層支持多種不同的執行引擎(默認是MapReduce)
- 支持不同的壓縮格式、存儲格式以及自定義函數
- Hive中的數據庫及表就是HDFS中的目錄/文件夾,數據是文件,元數據信息可以存儲在任意的一個關係型數據庫中(比如:MySQL、SqlServer、Oracle等,默認是Derby),數據存儲在HDFS中
Hive 的體系架構
上圖爲Hive的體系架構圖,主要由如下幾部分組成
用戶接口:Client
Cli(Command-line shell),及shell 命令行,hive1的客戶端,hive server2 提供了新的命令beeline
JDBC/ODBC,通過Java來訪問hive,與傳統數據庫JDBC的方式類型,比如我們使用Java通過JDBC訪問操作MySQL
WebUI,瀏覽器中訪問hive
元數據:metastore
Hive 將元數據存儲在數據庫中(metastore),數據庫可以爲關係型數據庫中的任意一種,元數據包括:表名、表所屬數據庫、表的擁有者、列/分區字段、表的類型、表數據所在目錄。
元數據存儲在MySQL上
驅動器:driver
包含:解析器、編譯器、優化器、執行器
完成 HQL 查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃(plan)的生成,生成的查詢計劃存儲在 HDFS 中,並在隨後有 MapReduce 調用執行
Hadoop
使用hdfs進行數據存儲,運行在yarn上,使用mapreduce進行計算
Hive 部署架構
在測試環境中
Hive 是構建在Hadoop之上的一個數據倉庫,實際工作中,我們的Hadoop是肯定是集羣,但Hive我們只需要裝在一臺服務上即可,元數據默認存放在Derby中,Derby是一個單用戶,使用起來不是很方便,建議我們自己裝一個mysql數據庫,專門用於存放hive的元數據信息。
在生產環境中
生產環境中與測試環境不相同的之處就是mysql用的是主備,當一臺mysql服務掛掉了,通過某種機制它會自動切換到另一臺,其實這樣做的好處就是爲了容錯,保證高可用,防止hive的元數據丟失
Hive與RDBM(關係型數據庫)的區別
Hive | RDBM |
---|---|
面向SQL | 面向SQL |
關注於分析統計,延時性比較高 | 更專注於實時,延時性比較短的分析 |
支持事務(高版本) | 支持事務 |
支持分區,隨機insert/update(高版本) | 支持隨機insert/update |
基於MapReduce的分佈式處理引擎 | 支持分佈式 |
成百上千個節點 | 很少超過20個 |
構建在廉價的機器上 | 通常情況是構建專用的機器上 |
能夠處理P級別的數據 | 到T…差不多了把… |
hive的優缺點
優點:
容易上手、易用,比用MapReduce編程簡單很多
數據離線處理,比如日誌分析,海量數據結構化分析
底層基於hadoop,易於擴展,支持自定義函數UDF
缺點:
Hive執行延遲比較高,不適合實時查詢
Hive優勢在於處理大數據集,對於小數據集沒有優勢
因爲Hive啓動是需要時間的,提交MapReduce作業.如果數據量比較小.說不定啓動時間比計算時間還要長.
不單單是啓動,最後還要銷燬.這就佔用了非常多的時間