• 从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的编译过程


    (完)

  • 相关阅读:
    js基础面试篇
    vue自定义指令
    vue兄弟节点通信
    vue----打包上线引用外部cdn
    vue----mockjs
    laravel database opearate1
    laravel seeding
    backtotop组件
    配置节流函数
    failed at the chromedriver@2.33.2 install script
  • 原文地址:https://www.cnblogs.com/harrymore/p/8950210.html
Copyright © 2020-2023  润新知