從HiveQL到MapReduce job過程簡析


一、簡述

HiveQL是一種聲明式語言,用戶提交查詢,而Hive會將其轉換成MapReduce job,如下圖。一般來說大部分時間可以無視這個執行過程的內部邏輯,但是如果能了解這些底層實現細節,在調優的時候就會更得心應手。

未命名文件副本


二、過程

將HiveQL轉化為MapReduce任務,整個編譯過程主要分為六個階段:

  • Antlr定義SQL的語法規則,完成SQL詞法,語法解析,將SQL轉化為抽象語法樹AST;
  • 遍歷AST,抽象出查詢的基本組成單元查詢塊QueryBlock;
  • 遍歷QueryBlock,將QueryBlock轉化為邏輯查詢計划OperatorTree;
  • 邏輯層優化器進行OperatorTree變換,合並不必要的ReduceSinkOperator,減少shuffle數據量;
  • 遍歷OperatorTree,翻譯為MapReduce任務;
  • 物理層優化器進行MapReduce任務的變換,生成最終的執行計划。


1. 將SQL轉為AST

(1)ANTLR(Another Tool for Language Recognition)

是一個語法分析器(Parser),可以用來構造領域語言。它允許我們定義識別字符流的詞法規則和用於解釋Token流的語法分析規則,然后,ANTLR將根據用戶提供的語法文件自動生成相應的詞法/語法分析器。用戶可以利用他們將輸入的文本進行編譯,並轉換成其他形式,如AST。

(2)AST(Abstract Syntax Tree)

AST表明Hive是如何將查詢解析成token(符號)和literal(字面值)的,以下面的HQL為例:

select sum(number) from onecol;

轉化為AST的形式為:

ABSTRACT SYNTAX TREE;
(TOK_QUERY
    (TOK_FROM (TOK_TABREF (TOK_TABNAME onecol)))
    (TOK_INSERT (TOK_DESTINATION (TOK_DIR TOK_TMP_FILE))
    (TOK_SELECT
        (TOK_SELEXPR
            (TOK_FUNCTION sum (TOK_TABLE_OR_COL number))))))


2. 語義分析(Semantics Analyze)

這個過程主要是遍歷AST,抽象出查詢的基本組成單元查詢塊QueryBlock。

QueryBlock是一條SQL最基本的組成單元,包括三個部分:輸入源,計算過程,輸出。簡單來講一個QueryBlock就是一個子查詢。


3. 將QueryBlock轉化為OperatorTree

遍歷QueryBlock,生成OperatorTree,OperatorTree由很多邏輯操作符組成,如TableScanOperator、SelectOperator、FilterOperator、JoinOperator、GroupByOperator和ReduceSinkOperator等。這些邏輯操作符可在Map、Reduce階段完成某一特定操作。


4. 優化OperatorTree

Hive驅動模塊中的邏輯優化器對OperatorTree進行優化,變換OperatorTree的形式,合並多余的操作符,減少MR任務數、以及Shuffle階段的數據量;


5. 翻譯為MapReduce任務

遍歷優化后的OperatorTree,根據OperatorTree中的邏輯操作符生成需要執行的MR任務。


6. 生成最終執行計划

啟動Hive驅動模塊中的物理優化器,對生成的MR任務進行優化,生成最終的MR任務執行計划。

整體流程如下:

20160123205210212


Hive驅動模塊中的執行器執行最終的MR任務時,Hive本身不會生成MR算法程序。它通過一個表示“Job執行計划”的XML文件,來驅動內置的、原生的Mapper和Reducer模塊。Hive通過和JobTracker通信來初始化MR任務,而不需直接部署在JobTracker所在管理節點上執行。通常在大型集群中,會有專門的網關機來部署Hive工具,這些網關機的作用主要是遠程操作和管理節點上的JobTracker通信來執行任務。Hive要處理的數據文件常存儲在HDFS上,HDFS由名稱節點(NameNode)來管理。


三、參考

1. antlr

2. 大數據時代--Hive技術原理解析

3. 基於Hadoop的數據倉庫Hive 基礎知識

4. Hive SQL的編譯過程


(完)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM