Hive3.1.2源码阅读--SQL的解析、编译、优化(一)

  1. 由前文可知,真正执行sql的位置是ret = qp.run(cmd).getResponseCode();
  2. ctrl+鼠标左键进入run方法中,发现其中是一个抽象方法
    在这里插入图片描述
  3. 按ctrl+H查看层级,进入Driver中,Driver中对run进行了实现;即真正的处理均在Driver中实现的,而run方法则是这个类的入口
    在这里插入图片描述在这里插入图片描述
  4. 可以发现run方法调用同名的方法,但输入参数多了一个alreadyComplied,该参数表示是否已经编译完成
  @Override

  public CommandProcessorResponse run(String command) {
    return run(command, false);//第二个参数表示是否已经编译完成
  }
  public CommandProcessorResponse run(String command, boolean alreadyCompiled) {
    // 这一句调用的runInternal是对sql的执行,下面都是对执行结果的校验
    // 不管对不对,先执行,保证优先性
    try {
      runInternal(command, alreadyCompiled);
      return createProcessorResponse(0);
    } catch (CommandProcessorResponse cpr) {
    }
  }
  1. 可以看到上述run方法中最重要的是进入了runInternal方法中,注意上文中传入的第二个参数是false
    在这里插入图片描述
  2. 进入runInternal方法中,根据alreadyCompiled=false我们可以找到程序该方法下一步调用的是compileInternal方法,先不着急进入该方法中,继续向下看,可以看到执行完compileInternal后会执行execute方法,即sql的解析、编辑、优化和最后的执行不是在一个方法中实现的
    6.1在 compileInternal方法中把SQL编译为QueryPlan(解析、编译、优化)
    6.2 在execute();中执行QueryPlan中的所有task
  //编译和执行程序同级别在该方法中调用
  private void runInternal(String command, boolean alreadyCompiled) throws CommandProcessorResponse {
      if (!alreadyCompiled) {
        // compile internal will automatically reset the perf logger
        // 调用compileInternal方法把SQL编译为QueryPlan
        compileInternal(command, true);//进行解析、编译、优化
        // then we continue to use this perf logger
        perfLogger = SessionState.getPerfLogger();
      } else {
        // reuse existing perf logger.
        perfLogger = SessionState.getPerfLogger();
        // Since we're reusing the compiled plan, we need to update its start time for current run
        plan.setQueryStartTime(perfLogger.getStartTime(PerfLogger.DRIVER_RUN));
      }
    
      try {
        // 调用execute执行QueryPlan中的所有task
        execute();
      } catch (CommandProcessorResponse cpr) {
        rollback(cpr);
        throw cpr;
      }
  }
  1. 我们先看sql的解析编译和优化过程,即 compileInternal
  private void compileInternal(String command, boolean deferClose) throws CommandProcessorResponse {
    try {
      // Driver的run方法最终会执行compile()操作,Compiler作语法解析和语义分析。
      // compile()是Driver最关键的方法,单个方法代码近300行。
      compile(command, true, deferClose);
    } catch (CommandProcessorResponse cpr) {
      try {
        releaseLocksAndCommitOrRollback(false);
      } catch (LockException e) {
        LOG.warn("Exception in releasing locks. " + org.apache.hadoop.util.StringUtils.stringifyException(e));
      }
      throw cpr;
    } finally {
      compileLock.unlock();
    }
  }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive是一个基于Hadoop的数据仓库基础结构,它提供了SQL查询和数据分析功能。Hive的源代码阅读是指对Hive项目的源代码进行逐行分析和理解,以深入了解Hive的内部工作原理和实现细节。 Hive的源代码阅读可以从导读开始。导读部分是Hive代码仓库中的一些重要文档和指南,它们提供了关于Hive项目的概述和指导。 首先,我们可以阅读Hive项目的README文件。该文件通常包含了对项目的介绍、功能特点和使用说明。README文件一般会介绍Hive的目标、核心组件和HiveQL查询语言等内容,为我们提供了整体了解Hive的入口。 接下来,我们可以查看Hive项目中的文档目录。在这个目录下,我们可以找到各种文档、指南和设计文档,它们详细描述了Hive的不同方面和内部机制。这些文档可以帮助我们了解Hive的体系结构、数据处理流程、优化技巧等内容,为后续阅读源代码提供了必要的背景知识。 此外,还可以关注Hive项目的WIKI页面。Hive的WIKI页面常常有丰富的内容,包括开发指南、常见问题解答等。这些页面中提供了一些较为具体和实用的信息,可以帮助我们更好地理解Hive的源代码。 在阅读Hive源代码时,我们应该注重核心模块和关键类的分析。可以从查询解析器、查询优化器和执行引擎等模块开始阅读。这些模块负责将HiveQL查询转化为Hadoop任务并执行查询操作。 最后,我们还可以参考Hive源代码中的注释和代码文档。良好的代码注释可以帮助我们理解代码的意图和实现细节,而代码文档则可以提供更加详细的说明和使用方法。 综上所述,Hive源码阅读的导读包括了阅读README文件、查看文档目录和WIKI页面、重点关注核心模块和关键类的分析,以及参考代码注释和文档等内容。通过导读,我们可以为接下来的源码阅读做好准备,更好地理解Hive的工作原理和实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值