HiveSQL的執行過程分析
首先,我們看一下hive的整個系統架構:
我們可以發現,hive主要由以下幾部分組成:
客戶端/ThriftServer/Driver/MetaStore四部分組成。
其中可用的客戶端包括:CLI(命令列介面)/JDBC或者ODBC客戶端/WEB介面介面,我們可以通過上面三種客戶端向hive提交我們的命令。
ThriftServer:Jdbc或者Odbc通過ThriftServer連線到Hive,而且Hive使用ThriftServer來連線到MetaStore來讀取hive的後設資料資訊。
MetaStore:Hive與Pig等系統的主要區別就是,在hive中提供了存放後設資料的MetaStore。Hive將表/分割槽/列等資訊存放在MetaStore中。Hive並沒有將MetaStore包存在HDFS上,而是將它儲存在了關聯式資料庫,比如MySql中。這麼做的主要目的就是,當Hive需要訪問MetaStore的時候,可以低延遲的快速的訪問到需要的後設資料資訊,而HDFS的訪問延遲一般都比較大。此外有一點需要注意的就是,分析HiveSQL之後生成的MapReduce任務在執行的時候如果需要訪問後設資料資訊時,它並不會直接去訪問MetaStore。那麼,他們是如何獲得需要的後設資料資訊的呢??原來,當將生成的物理計劃序列化到plan.xml的時候,已經將相應的後設資料資訊儲存到了plan.xml中。而plan.xml檔案之後會被放入Hadoop的分散式快取中,所以MapReduce任務就可以從分散式快取中獲得需要的後設資料資訊。
Driver/QueryCompiler/ExecutionEngine:客戶端提交的HiveSQL首先進入Driver,然後Driver會為此次HiveSQL的執行建立一個Session,Driver維護整個session的生命週期。Driver首先將HiveSQL傳送給QueryCompiler,然後由QueryCompiler來對使用者提交的HiveSQL進行編譯/檢查/優化並最終生成MapReduce任務。
首先 QueryCompiler對HiveSQL進行Parse,Hive使用Antlr語法解析器來對HiveSQL進行解析,並生成相應的AST(抽象語法樹)。之後,進入到Typechecking and SemanticAnalysis(型別的檢查和語法)的分析階段,hive需要訪問MetaStore後設資料資訊來進行檢查操作
。在該階段首先將上一步生成的AST轉化成operatortree(DAG有向無環圖),生成相應的邏輯計劃。然後Hive會根據一定的rule來對生成的operatortree的優化操作,在優化操作中會涉及到5個主要的物件,包括:Node,GraphWalker,Dispatcher,Rule,Processor。其中Node就代表DAG圖中的結點。整個優化的過程是:hive首先對GraphWalker和Dispatcher進行初始化,Dispatcher是GraphWalker的組成部分,而且Dispatcher中儲存了匹配某些rule需要的滿足條件以及rule與Processor的對應對映關係。然後hive通過GraphWalker對整個DAG進行遍歷,當訪問到某個Node的時候,通過Dispatcher對該Node進行rule判斷,檢視它是否滿足了某個rule的條件,如果滿足了rule的條件,然後再通過Dispatcher找到與該rule對應的Processor,最終通過Processor對該Node進行處理。整個流程圖如下:
當進行優化之後,會將DAG轉化稱相應的MapReduce任務。
生成的MapReduce任務會交給Hive的ExecutionEngine來執行,ExecutionEngine會與Hadoop進行互動,將MapReduce任務交給Hadoop來執行,並從Hadoop取得最終的執行結果,並返回給使用者。至此整個Hive的執行過程結束了。
相關文章
- 原始碼分析OKHttp的執行過程原始碼HTTP
- Informix 執行緒sleep 分析過程ORM執行緒
- crtmpserver 執行過程簡明分析Server
- PostgreSQL的insert語句執行過程分析SQL
- Aqua Data Studio 執行HiveSql的問題HiveSQL
- SAP Spartacus 裡的 cxOutletRef 指令執行過程分析
- 指令的執行過程
- jsp的執行過程JS
- webpack loader 的執行過程Web
- Redis 命令的執行過程Redis
- laravel 應用層執行過程原始碼分析Laravel原始碼
- 程式執行過程記憶體分析詳解記憶體
- 執行緒池建立執行緒的過程執行緒
- MYSQL sql執行過程的一些跟蹤分析(一)MySql
- Mybatis原始碼分析(五)探究SQL語句的執行過程MyBatis原始碼SQL
- 線上定時指令碼執行慢,分析過程指令碼
- javascript引擎執行的過程的理解--執行階段JavaScript
- 一條Sql的執行過程SQL
- Javascript中new的執行過程JavaScript
- 萬字長文詳解HiveSQL執行計劃HiveSQL
- Linux下安裝hive 詳解及HiveSQL執行LinuxHiveSQL
- Java 程式執行過程Java
- Spring原始碼分析(七)SpringAOP生成代理類及執行的過程Spring原始碼
- 怎麼辦?用DolphinScheduler排程執行復雜的HiveSQL時無法正確識別符號HiveSQL符號
- js函式執行過程的探究JS函式
- 淺析Java程式的執行過程Java
- KVC中setValue:forKey:的執行過程
- MapReduce 執行全過程解析
- 程式語言執行過程
- Oracle ASM Rebalance執行過程OracleASM
- JS引擎執行緒的執行過程的三個階段JS執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- 《閒扯Redis八》Redis字典的雜湊表執行Rehash過程分析Redis
- 分析執行計劃優化SQLSQL語句處理的過程(轉)優化SQL
- 精盡MyBatis原始碼分析 - SQL執行過程(二)之 StatementHandlerMyBatis原始碼SQL
- 精盡MyBatis原始碼分析 - SQL執行過程(三)之 ResultSetHandlerMyBatis原始碼SQL
- 精盡MyBatis原始碼分析 - SQL執行過程(一)之 ExecutorMyBatis原始碼SQL
- MySQL 中一條 sql 的執行過程MySql
- Java執行緒池的增長過程Java執行緒