• hive源码(八)源码总结


    hive源码 观后总结

    整体流程
        1.进入程序,利用Antlr框架定义的预发规则,对HQL完成语法解析,将HQL转换为AST(抽象语法树)
        2.遍历AST,抽象出查询的基本构成单元QueryBlock(查询块),可以理解为最小查询执行单元
        3.遍历QueryBlock,将它转换为OperatorTree(操作树),可以理解成不可拆分的逻辑执行单元
        4.逻辑优化器对OperatorTree进行逻辑优化。
        5.OperatorTree转换为TaskTree,就是翻译成MR任务的流程,将逻辑执行计划转换为物理执行计划
        6.物理优化器对TaskTree进行物理优化
        7.生成最终的执行计划,提交到集群运行
    重要类详解
        CliDriver:
            1.参数设置,日志标准化,-S -e -f -i -database 等参数
            2.每一行 按照;切分 处理   shell处理     处理exit  ctrl+C   计算时长、打印结果
        Driver:
            1.hook Driver run之前的hook、语法分析之前hook、执行计划前hook、task执行前 后 失败hook
            2.sql 通过antlr转成AST(抽象语法树)
                FromClauseParser.g:from后面的sql的匹配规则   SelectClauseParser.g:select后面的sql的匹配规则
                IdentifiersParser.g:函数的解析   HiveParser.g:语法解析的
                上面基本上就是一些关键字,下面主要是函数都是一个关键字组成的语法:一个init和after函数  
                init其实大部分是打印日志的    after主要枚举了可以执行的语法
                AST TOK_***   树状结构不简洁:SELECT->TOK_TABLE_OR_COL->真正名称
            3.物理执行计划执行:两个队列一个running 一个runnable
                两种执行方式:1.一个程序执行:hive-exec-3.1.3.jar org.apache.hadoop.hive.ql.exec.mr.ExecDriver 
                2.yarn 提交job
        SemanticAnalyzer:
            1.替换数字
            2.AST转换为QB(查询块)  JOIN以后的对象还是AST存储qbp,join以前的aliasToSubq aliases 里面存储
            3.QB转OperatorTree(操作树 逻辑执行树)  TS SEL GBY RS FIL FS  逻辑执行的优化
                Rule定义:R1(TS) R2[RS] R3[FIL] .startwork 如果符合上面定义的规则,才对树进行操作
                or换成in  where(struct用法拆出来分区字段)  条件传播(where传播)  表达式算成常量
                where下推  列裁剪(从最后的节点往前推)  分区裁剪(没有对树进行操作节点的属性拉出来)
                分区移除(分区相关的节点移除)  节点删除(连续SEL节点去除,没有列裁剪的SEL去除)
                LIMIT下推(RS 后面会跟一个limit属性)  元数据统计  取样(FS转换成LIST_SINK)
            4.逻辑执行计划转换为物理执行计划  GBY节点和JOIN节点都会被转换成一个mapreduce
                hive根目录+随机数  就是中间数据存储路径  path和类型 类型下推  物理执行计划就完成了

            5.物理执行计划优化:mapjoin可能的优化  本地计算(单机计算)  执行结果为空limit 0
                Vectorizer hive函数注册  CrossProductHandler(mr/tez MapJoin/Shuffle 交叉乘积)
                rootTask对象有一个work对象(mapwork reducework childrenWork path路径)
    源码解析相关博客
        源码分析相关的博客:
        https://blog.csdn.net/wzq6578702/category_6019045.html?spm=1001.2014.3001.5482
        https://blog.csdn.net/zyzzxycj/article/details/102861166
        逻辑优化器源码分析博客:
        https://cloud.tencent.com/developer/column/95255
  • 相关阅读:
    第六节:流上下文
    第五节:控制序列化和反序列化的数据
    第四节:格式化器如何序列化类型实例
    第三节:控制序列化和反序列化
    第二节:使类型可序列化
    第一节:序列化和反序列化快速入门
    第五节:使用反射发现类型成员
    golang 一些坑 rang
    golang json格式字符串反序列化映射到切片结构体
    golang 结构体内嵌结构体序列化填充
  • 原文地址:https://www.cnblogs.com/wuxiaolong4/p/16576385.html
Copyright © 2020-2023  润新知