hive源碼結構分析(編譯器)

本文轉自:http://samuschen.iteye.com/blog/860809

Hive 是將 SQL 語句轉換成 hadoop 的 MapReduce 程序,通常在客戶端執行 hive 命令,然後輸入 SQL 語句後, hive 將 SQL 語句生成多個 MR 的 job ,然後將這些 job 提交給 hadoop 進行執行,完成後,再把結果放入到hdfs 或者本地的臨時文件中。 Hive 中的表結構信息都是保存在關係型數據庫中,如 mysql,derby 等,可以通過hive-site.xml 中配置數據庫的 URL, 用戶名,密碼等。而表的實際數據內容保存在 hadoop 的 hdfs 文件中,行和列數據分別用特殊字符串分格開,以便能夠讀取數據,默認是用 ctrl+a 和 \n 來分隔。

       客戶 / 服務器通信:由 org.apache.hadoop.hive.ql 包中的 Driver 類來完成,該類主要有一個 run(command) 方法,而該方法主要有二個方法組成:

int ret = compile(command); 此方法主要完成語法,語義,計劃生成。

ret = execute(); 執行物理計劃,即提交相應的 job 給 hadoop 進行執行。

執行完成後,會將執行結果通過 CommandProcessorResponse 類包裝返回給客戶端。

另外,在hive 中,提供本地直接運行hive 命令,也提交了jdbc 訪問。具體實現分別在對應的包裏。

       語法分析器:將 sql 語句轉換成一顆語法樹,像編譯原理書上講的,其實就是一個普通樹,只不過這顆保存了sql 語句的結構,而 hive 是用 anltr 自動生成的語法樹。分別由 org.apache.hadoop.hive.ql.parse 包中的HiveLexer和HiveParser 完成詞法和語法分析工作。

       語義分析:根據不同的類型的語句生成不同的語法,所以有個抽象語義分析類 BaseSemanticAnalyzer ,分別有以下子類,對應於不同類型的語句:

ExplainSemanticAnalyzer

ExplainSemanticAnalyzer

LoadSemanticAnalyzer

DDLSemanticAnalyzer

FunctionSemanticAnalyzer

SemanticAnalyzer

       語義分析完成後,會將語句中的相應信息放入到 org.apache.hadoop.hive .ql.plan 包中 *Desc 類中,這些類記錄了相應語句的基本信息。

       然後會對語義完了的信息進行驗證,比如表是否存在,字段是否存在,這時需要查詢元數據,同時將表的相關信息放到 desc 對象中。

邏輯計劃生成器:根據語義分析後的相關信息,將生成出邏輯操作樹,抽象類爲 Operator 。子類有:

ExtractOperator

FilterOperator

ForwardOperator

GroupbyOperator

LateralViewJoinOperator

LimitOperator

MapOperator

ScriptOperator

SelectOperator

TableScanOperator

TerminalOperator-Base Class

FileSinkOperator

ReduceSinkOperator

UDTFOperator

UnionOperator

計劃優化器:將操作樹進行一些優化,主要是基於規則的優化。這部分,這次我略過了,下次再講解。

物理計劃生成器:根據邏輯操作樹生成出物理計劃樹,這個物理計劃是由 Task 對象來包裝的,而 Task 類會有一個Work 對象, Work 類是物理計劃的描述,當 task 對象執行時,通常需要用到 work 對象上的相關信息。

Work 子類有:

FetchWork 

MoveWork

MapredWork

CopyWork

DDLWork

FunctionWork

ExplainWork

ConditionalWork

物理計劃執行器:就是將一顆含有 Task 類對象的樹,進行從上到下執行。分別調用該對象的 execute() 方法,而該方法會完成相應的物理計劃執行工作。主要有:

FetchTask

ConditionalTask

CopyTask

DDLTask

ExplainTask

MapRedTask

MoveTask

每個類都表示一種物理計劃。如 FetchTask 就是從 hdfs 或者本地文件中取出表或視圖的記錄。

       總結, Hive 跟大多數的關係數據庫類似的,有相同的步驟來完成從語句到最後物理執行。不同的是 Hive 的執行是在 hadoop 的 MR 程序來執行。同時在這個過程中的,操作類,計劃類都是由 Java 對象來包裝起來,且可以序列化的,相信其他數據庫的計劃也是某種語言的對象來保存的。


發佈了35 篇原創文章 · 獲贊 4 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章