基礎性的東西,不過在回答的時候要能回答出彩來
什么是Hive
- Hive是由Facebook開源用于解決海量結構化日志的數據統計;Hive是基于Hadoop的一個數據倉庫工具,可以將結構化的數據文件映射 成一張表,并提供類SQL查詢功能,底層計算引擎默認為Hadoop的MapReduce(本質是將sql轉化成mapreduce程序),可以將引擎更換為Spark/Tez;
Hive架構
Hive架構.PNG
- 如圖中所示,Hive通過給用戶提供的一系列交互接口,接收到用戶的指令(SQL),使用自己的Driver,結合元數據(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執行,最后,將執行返回的結果輸出到用戶交互接口。
- 1)用戶接口:Client
- CLI(hive shell)、JDBC/ODBC(java訪問hive)、WEBUI(瀏覽器訪問hive)
- 2)元數據:Metastore
- 元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等;
默認存儲在自帶的derby數據庫中,推薦使用MySQL存儲Metastore - 推薦學習博客 數倉--Hive--元數據表結構學習
- 元數據包括:表名、表所屬的數據庫(默認是default)、表的擁有者、列/分區字段、表的類型(是否是外部表)、表的數據所在目錄等;
- 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/Spark。
Hive優點
- 操作接口采用類SQL語法,提供快速開發的能力(簡單、容易上手);
- 避免了去寫MapReduce,減少開發人員的學習成本;
- 統一的元數據管理,可與impala/spark等共享元數據;
- 易擴展(HDFS+MapReduce:可以擴展集群規模;支持自定義函數);
Hive使用場景
- 數據的離線處理;比如:日志分析,海量結構化數據離線分析…
- Hive的執行延遲比較高,因此hive常用于數據分析的,對實時性要求不高的場合;
- Hive優勢在于處理大數據,對于處理小數據沒有優勢,因為Hive的執行延遲比較高。
Hive的執行流程
- HiveQL通過CLI/web UI或者thrift 、 odbc 或 jdbc接口的外部接口提交,經過complier編譯器,運用Metastore中的元數據進行類型檢測和語法分析,生成一個邏輯方案(logical plan),然后通過簡單的優化處理,產生一個以有向無環圖DAG數據結構形式展現的map-reduce任務。
SQL轉化成MapReduce過程
- Hive是如何將SQL轉化為MapReduce任務的,整個編譯過程分為六個階段:
- 1-Antlr定義SQL的語法規則,完成SQL詞法,語法解析,將SQL轉化為抽象語法樹AST Tree;
- 2-遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock;
- 3-遍歷QueryBlock,翻譯為執行操作樹OperatorTree;
- 4-邏輯層優化器進行OperatorTree變換,合并不必要的ReduceSinkOperator,減少shuffle數據量;
- 5-遍歷OperatorTree,翻譯為MapReduce任務;
- 6-物理層優化器進行MapReduce任務的變換,生成最終的執行計劃。
推薦學習博客:hive sql語句轉換成mapreduce