一、首先是概念:
大體可以劃分爲七個方面,這樣有利於理解記憶:
1、由FaceBook實現並開源;
2、基於Hadoop的開源數據倉庫工具,用於存儲結構化的數據;
3、可以將結構化的數據映射爲一張數據庫表;
4、底層數據存儲在HDFS文件系統上,描述數據的數據(元數據)存儲在derby或者是遠程數據庫中,如:mysql;
5、提供一套類數據庫的處理機制,HQL查詢功能;
6、本質是將SQL語句轉換爲MapReduce任務運行;
7、使不熟悉MapReduce的用戶很方便的利用HQL處理和計算HDFS上的結構化數據,適用於離線批量數據計算。
二、優缺點
優點
1、可擴展:Hive可以自由的擴展集羣的規模,一般情況下不需要重啓服務.
2、延展性: Hive支持用戶自定義函數,用戶可以根據自己的需求來實現自己的函數.
3、容錯:良好的容錯性,節點出現問題SQL仍可完成執行.
缺點
1、不支持記錄級別的更新、插入和刪除操作:
Hive不是一個完整的數據庫。Hadoop以及hdfs的設計本身約束和侷限性地限制了hive所能勝任的工作。Hive不支持記錄級別的更新、插入和刪除操作。但是用戶可以通過查詢生成新表或者將查詢結果導入到文件中。
2、查詢延時比較嚴重:
因爲Hadoop是一個面向批處理的系統,而mapreduce任務(job)的啓動過程需要消耗較長的時間,所以hive查詢延時比較嚴重。傳統數據庫中在秒級可以完成的查詢,在hive中,即時數據集相對較小,往往也需要執行更長的時間。由於Hadoop本身的時間開銷很大,並且Hadoop所被設計用來處理的數據規模非常大,因此提交查詢和返回結果是可能具有非常大的延時的,所以hive並不能滿足OLAP的“聯機”部分,至少目前並沒有滿足。如果用戶需要對大規模數據使用OLTP功能的話,那麼應該選擇使用一個NOSQL數據庫。例如,和Hadoop結合使用的HBase及Cassandra.
3、不支持事務:
因爲不沒有增刪改,所以主要用來做 OLAP(聯機分析處理),而不是 OLTP(聯機事務處理),這就是數據處理的兩大級別。
三、Hive 和 RDBMS 的對比
對比項 | Hive | RDBMS |
查詢語言 | HQL | SQL |
據存儲 | HDFS | Raw Device or Local FS |
執行器 | MapReduce | Executor |
數據插入 | 支持批量導入 / 單條插入 | 支持單條或者批量導入 |
數據操作 | 覆蓋追加 | 行級更新刪除 |
處理數據規模 | 大 | 小 |
執行延遲 | 高 | 低 |
分區 | 支持 | 支持 |
索引 | 0.8 版本之後加入簡單索引 | 支持複雜的索引 |
擴展性 | 高(好) | 有限(差) |
數據加載模式 | 讀時模式(快) | 寫時模式(慢) |
應用場景 | 海量數據查詢 | 實時查詢 |
總結:Hive 具有 SQL 數據庫的外表,但應用場景完全不同,Hive 只適合用來做海量離線數據統計分析,也就是數據倉庫。
四、架構
基本組成
1、 用戶接口
CLI,Shell 終端命令行(Command Line Interface),採用交互形式使用 Hive 命令行與 Hive進行交互,最常用(學習,調試,生產)JDBC/ODBC,是 Hive 的基於 JDBC 操作提供的客戶端,用戶(開發員,運維人員)通過這連接至 Hive server 服務Web UI,通過瀏覽器訪問 Hive
2、Thrift Server
Thrift 是 Facebook 開發的一個軟件框架,可以用來進行可擴展且跨語言的服務的開發,Hive 集成了該服務,能讓不同的編程語言調用 Hive 的接口
3 、 元數據存儲
元數據,通俗的講,就是存儲在 Hive 中的數據的描述信息。Hive 中的元數據通常包括:表的名字,表的列和分區及其屬性,表的屬性(內部表和外部表),表的數據所在目錄Metastore 默認存在自帶的 Derby 數據庫中。缺點就是不適合多用戶操作,並且數據存儲目錄不固定。數據庫跟着 Hive 走,極度不方便管理。
解決方案:通常存我們自己創建的 MySQL 庫( 本地 或 遠程)Hive 和 MySQL 之間通過 MetaStore 服務交互。
4 、Driver : 編譯器 (Compiler) ) ,優化器 (Optimizer) ) ,執行器 (Executor )
Driver 組件完成 HQL 查詢語句從詞法分析,語法分析,編譯,優化,以及生成邏輯執行
計劃的生成。生成的邏輯執行計劃存儲在 HDFS 中,並隨後由 MapReduce 調用執行
Hive 的核心是驅動引擎, 驅動引擎由四部分組成:
(1) 解釋器:解釋器的作用是將 HiveSQL 語句轉換爲抽象語法樹(AST)
(2) 編譯器:編譯器是將語法樹編譯爲邏輯執行計劃
(3) 優化器:優化器是對邏輯執行計劃進行優化
(4) 執行器:執行器是調用底層的運行框架執行邏輯執行計劃
五、Hive的工作原理如下:
接收到一個sql,後面做的事情包括:1.詞法分析/語法分析:使用antlr將SQL語句解析成抽象語法樹-AST
2.語義分析:從Megastore獲取模式信息,驗證SQL語句中隊表名,列名,以及數據類型的檢查和隱式轉換,以及Hive提供的函數和用戶自定義的函數(UDF/UAF)
3.邏輯計劃生產:生成邏輯計劃-算子樹
4.邏輯計劃優化:對算子樹進行優化,包括列剪枝,分區剪枝,謂詞下推等
5.物理計劃生成:將邏輯計劃生產包含由MapReduce任務組成的DAG的物理計劃
6.物理計劃執行:將DAG發送到Hadoop集羣進行執行
7.將查詢結果返回
Query Compiler:
新版本的Hive也支持使用Tez或Spark作爲執行引擎。
物理計劃可以通過hive的Explain命令輸出,例如:
0: jdbc:hive2://master:10000/dbmfz> explain select count(*) from record_dimension;
+------------------------------------------------------------------------------------------------------+--+
| Explain |
+------------------------------------------------------------------------------------------------------+--+
| STAGE DEPENDENCIES: |
| Stage-1 is a root stage |
| Stage-0 depends on stages: Stage-1 |
| |
| STAGE PLANS: |
| Stage: Stage-1 |
| Map Reduce |
| Map Operator Tree: |
| TableScan |
| alias: record_dimension |
| Statistics: Num rows: 1 Data size: 543 Basic stats: COMPLETE Column stats: COMPLETE |
| Select Operator |
| Statistics: Num rows: 1 Data size: 543 Basic stats: COMPLETE Column stats: COMPLETE |
| Group By Operator |
| aggregations: count() |
| mode: hash |
| outputColumnNames: _col0 |
| Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE |
| Reduce Output Operator |
| sort order: |
| Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE |
| value expressions: _col0 (type: bigint) |
| Reduce Operator Tree: |
| Group By Operator |
| aggregations: count(VALUE._col0) |
| mode: mergepartial |
| outputColumnNames: _col0 |
| Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE |
| File Output Operator |
| compressed: false |
| Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE |
| table: |
| input format: org.apache.hadoop.mapred.SequenceFileInputFormat |
| output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat |
| serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe |
| |
| Stage: Stage-0 |
| Fetch Operator |
| limit: -1 |
| Processor Tree: |
| ListSink |
| |
+------------------------------------------------------------------------------------------------------+--+
42 rows selected (0.844 seconds)
除了DML,Hive也提供DDL來創建表的schema。Hive數據存儲支持HDFS的一些文件格式,比如CSV,Sequence File,Avro,RC File,ORC,Parquet。也支持訪問HBase。
Hive提供一個CLI工具,類似Oracle的sqlplus,可以交互式執行sql,提供JDBC驅動作爲Java的API。
六、Hive 的數據存儲
1、Hive的存儲結構包括數據庫、表、視圖、分區和表數據等。數據庫,表,分區等等都對應HDFS上的一個目錄。表數據對應HDFS對應目錄下的文件。
2、Hive中所有的數據都存儲在HDFS中,沒有專門的數據存儲格式,因爲Hive是讀模式(Schema On Read),可支持TextFile,SequenceFile,RCFile 或者自定義格式等。
3、只需要在創建表的時候告訴 Hive 數據中的 列分隔符和 行分隔符,Hive 就可以解析數據。
Hive 的默認列分隔符:控制符 Ctrl + A,\x01
Hive 的默認行分隔符:換行符 \n
4、Hive中包含以下數據模型:
database:在 HDFS 中表現爲${hive.metastore.warehouse.dir}目錄下一個文件夾。
table:在 HDFS 中表現所屬 database 目錄下一個文件夾。
external table:與 table 類似,不過其數據存放位置可以指定任意 HDFS 目錄路徑。
partition:在 HDFS 中表現爲 table 目錄下的子目錄。
bucket:在 HDFS 中表現爲同一個表目錄或者分區目錄下根據某個字段的值進行 hash 散列之後的多個文件。
view:與傳統數據庫類似,只讀,基於基本表創建。
5、Hive的元數據存儲在 RDBMS 中,除元數據外的其它所有數據都基於 HDFS 存儲。默認情況下,Hive 元數據保存在內嵌的 Derby 數據庫中,只能允許一個會話連接,只適合簡單的測試。實際生產環境中不適用,爲了支持多用戶會話,則需要一個獨立的元數據庫,使用MySQL 作爲元數據庫,Hive 內部對 MySQL 提供了很好的支持。
6、Hive中的表分爲內部表、外部表、分區表和分桶表。
內部表和外部表的區別:刪除內部表,刪除表元數據和數據
刪除外部表,刪除元數據,不刪除數據
內部表和外部表的使用選擇:大多數情況,他們的區別不明顯,如果數據的所有處理都在 Hive 中進行,那麼傾向於選擇內部表,但是如果 Hive 和其他工具要針對相同的數據集進行處理,外部表更合適。使用外部表訪問存儲在 HDFS 上的初始數據,然後通過 Hive 轉換數據並存到內部表中使用外部表的場景是針對一個數據集有多個不同的 Schema通過外部表和內部表的區別和使用選擇的對比可以看出來,hive 其實僅僅只是對存儲在HDFS 上的數據提供了一種新的抽象。而不是管理存儲在 HDFS 上的數據。所以不管創建內部表還是外部表,都可以對 hive 表的數據存儲目錄中的數據進行增刪操作。
分區表和分桶表的區別:Hive 數據表可以根據某些字段進行分區操作,細化數據管理,可以讓部分查詢更快。同時表和分區也可以進一步被劃分爲 Buckets,分桶表的原理和 MapReduce 編程中的HashPartitioner 的原理類似分區和分桶都是細化數據管理,但是分區表是手動添加區分,由於 Hive 是讀模式,所以對添加進分區的數據不做模式校驗,分桶表中的數據是按照某些分桶字段進行 hash 散列形成的多個文件,所以數據的準確性也高很多。