中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

hive sql的執行及編譯過程

發布時間:2020-05-21 00:07:32 來源:網絡 閱讀:1027 作者:abebill 欄目:大數據

一、hive在執行sql時會以mapreduce的方式對數據進行接入和處理,其主要包含以下幾個階段:
hive sql的執行及編譯過程
1.hive首先根據sql語句中的表從hdfs文件中獲取數據,對數據文件進行split操作,使其可以一行一行將所需數據讀入內存;
2.map函數將內存中的數據按照key值進行映射,形成一行一行的key-value值,比如用戶表中的性別字段,內存中map處理后的記錄如下:
hive sql的執行及編譯過程
3.在實際應用中會有多臺機器參與map處理,map完成后需要將帶有相同key的數據分發到同一臺集群去進行后續處理,此時的操作稱為shuffle;
4.如果sql中包含有join、count、sum,此時還會進行reduce操作,比如count,其完成reduce后數據情況如下:
hive sql的執行及編譯過程

二、在hive底層,同時還會將上面的sql進行編譯,其過程主要包含以下六點:
hive sql的執行及編譯過程
為便于理解,我們拿一個簡單的查詢語句進行展示,對5月30號的地區維表進行查詢:

select * from dim.dim_region where dt = '2019-05-30'

1.根據Antlr定義的sql語法規則,將相關sql進行詞法、語法解析,轉化為抽象語法樹AST Tree

ABSTRACT SYNTAX TREE:
TOK_QUERY
    TOK_FROM 
    TOK_TABREF
           TOK_TABNAME
               dim
                 dim_region
    TOK_INSERT
      TOK_DESTINATION
          TOK_DIR
              TOK_TMP_FILE
        TOK_SELECT
          TOK_SELEXPR
              TOK_ALLCOLREF
        TOK_WHERE
          =
              TOK_TABLE_OR_COL
                  dt
                    '2019-05-30'

2.遍歷AST Tree,抽象出查詢的基本組成單元QueryBlock
AST Tree生成后由于其復雜度依舊較高,不便于翻譯為mapreduce程序,需要進行進一步抽象和結構化,形成QueryBlock。QueryBlock是一條SQL最基本的組成單元,包括三個部分:輸入源,計算過程,輸出。簡單來講一個QueryBlock就是一個子查詢。QB的生成過程為一個遞歸過程,先序遍歷 AST Tree ,遇到不同的Token 節點(理解為特殊標記),保存到相應的屬性中,主要包含以下幾個過程:

  • TOK_QUERY:創建 QB 對象,循環遞歸子節點
  • TOK_FROM:將表名語法部分保存到 QB 對象的 aliasToTabs 等屬性中
  • TOK_INSERT:循環遞歸子節點
  • TOK_DESTINATION:將輸出目標的語法部分保存在 QBParseInfo 對象的nameToDest 屬性中
  • TOK_SELECT:分別將查詢表達式的語法部分保存在 destToSelExpr 、destToAggregationExprs 、 destToDistinctFuncExprs 三個屬性中
  • TOK_WHERE:將 Where 部分的語法保存在 QBParseInfo 對象的destToWhereExpr 屬性中

3.遍歷QueryBlock,翻譯為執行操作樹OperatorTree
Hive最終生成的MapReduce任務,Map階段和Reduce階段均由OperatorTree組成。邏輯操作符,就是在Map階段或者Reduce階段完成單一特定的操作。
基本的操作符包括TableScanOperator,SelectOperator,FilterOperator,JoinOperator,GroupByOperator,ReduceSinkOperator
ReduceSinkOperator將Map端的字段組合序列化為Reduce Key/value, Partition Key,只可能出現在Map階段,同時也標志著Hive生成的MapReduce程序中Map階段的結束。
Operator在Map Reduce階段之間的數據傳遞都是一個流式的過程。每一個Operator對一行數據完成操作后之后將數據傳遞給childOperator計算。
由于Join/GroupBy/OrderBy均需要在Reduce階段完成,所以在生成相應操作的Operator之前都會先生成一個ReduceSinkOperator,將字段組合并序列化為Reduce Key/value, Partition Key。

4..Logical Optimizer對OperatorTree進行優化操作
使用ReduceSinkOperator,減少shuffle數據量。大部分邏輯層優化器通過變換 OperatorTree ,合并操作符,達到減少 MapReduce Job ,減少 shuffle 數據量的目的。

5.遍歷OperatorTree,并翻譯為MapReduce任務
OperatorTree 轉化為 Task tree的過程分為下面幾個階段

對輸出表生成 MoveTask
從 OperatorTree 的其中一個根節點向下深度優先遍歷
ReduceSinkOperator 標示 Map/Reduce 的界限,多個 Job 間的界限
遍歷其他根節點,遇過碰到 JoinOperator 合并 MapReduceTask
生成 StatTask 更新元數據
剪斷 Map 與 Reduce 間的 Operator 的關系

6.物理層優化器對MapReduce任務進行優化,生成最終的執行計劃

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

蒙城县| 谷城县| 时尚| 沾化县| 靖州| 山阳县| 麟游县| 桓台县| 黑山县| 镇康县| 承德市| 阳春市| 耿马| 惠安县| 册亨县| 卓资县| 从化市| 太原市| 南宫市| 额尔古纳市| 齐河县| 涟源市| 永德县| 陕西省| 嘉黎县| 巩义市| 永和县| 恭城| 湘阴县| 红安县| 呼和浩特市| 汪清县| 五峰| 儋州市| 湖口县| 沿河| 商河县| 兰州市| 邵东县| 游戏| 普兰店市|