这里我们从BeeLine.execute讲起。
  接下来来到BeeLine.dispatch,这里的入参就是sql语句。方法的最后调用了Commands.sql,然后调用到了Commands.execute。
  如下图所示,这里是Commands.execute中的关键逻辑。
  1.调用BeeLine.createStatement,该方法间接调用了HiveConnection.createStatement。在后面的方法中构建了HiveStatement。
  2.调用了Commands.createLogRunnable,在该方法中循环调用HiveStatement.hasMoreLogs。并且将方法HiveStatement.getQueryLog中获取到的数据使用BeeLine.info输出到控制台。该方法封装为Runnable然后返回,后面使用线程封装并调用。
  3.调用HiveStatement.execute,该方法首先调用closeClientOperation与initFlags重置了部分成员变量,以便下一次调用。
  4.然后调用Client.ExecuteStatement,获取返回的operationHandle,并为下一次调用做准备。
  5.遍历调用Client.GetOperationStatus,直到获取的状态为CLOSED_STATE或FINISHED_STATE,此时就可以将变量operationComplete置为true,跳出循环。
  6.构造结果集HiveQueryResultSet并返回。在构造期间我们需要注意这里会调用到HiveQueryResultSet.retrieveSchema。这里间接调用了Client.GetResultSetMetadata。
  7.后面调用了showRemainingLogsIfAny,该方法间接调用到了HiveStatement.getQueryLog,该方法内部就调用了Client.FetchResults。
  这里有一个令人疑惑的地方——构造了logThread线程后,调用其start方法,然后调用HiveStatement.execute,接着又调用了线程的interrupt与join方法。这里更多的是在服务端需要跑MR任务时获取相关的任务状态。
  1.首先调用logThread.start,此时是为了前期对于任务的监听。在logThread中循环的布尔条件,也就是HiveStatement.isLogBeingGenerated此时一直为true,也就是该线程一直在运行。
  2.然后调用了HiveStatement.execute,该方法在执行完Client.ExecuteStatement后调用Client.GetOperationStatus来获取语句的执行情况,如果语句的执行状态变更为FINISHED_STATE,则更新上面的变量值HiveStatement.isLogBeingGenerated为false。
  3.调用logThread.interrupt,也就是说,将logThread的中断值置为true。如果logThread此时处于sleep状态,那么会抛出InterruptedException异常,执行showRemainingLogsIfAny方法继续调用方法hiveStatement.getQueryLog来获取job状态信息。如果logThread不处于休眠状态,则会等到其下一次休眠时(如果有的话),同样会来到方法showRemainingLogsIfAny,继续查询job的状态。
  4.调用了logThread.join,其入参值为10s,也就是说,如果10s后logThread仍然运行,那么会停止监控。
  在BufferedRows的构造方法中就已经将所有的数据取回。这里主要调用了两个方法——HiveQueryResultSet.next与Row的构造方法。
  1.如下图所示,这里是HiveQueryResultSet.next方法中比较重要的逻辑部分。这里首先调用Client.FetchResults从服务端获取结果集,然后通过方法RowSetFactory.create构造了ColumnBasedSet(由于我们这里的版本号是HIVE_CLI_SERVICE_PROTOCOL_V7,因此构造的类是ColumnBasedSet,并且在该构造方法中完成了将返回的数据集封装到类型内成员变量的流程)。另外ColumnBasedSet覆写了接口Iterable中的iterator方法。用于后面迭代将数据取出。
这里的next方法中的条件判断保证了只要有数据取回,便会一直返回true,只有从服务端取回的数据为空时,这里的返回结果才为false。
  2.Row的构造方法,如下图所示:
  下图框选出该构造方法中的重点方法——HiveBaseResultSet.getString。这里会将上面方法中对成员变量row赋予的值取出为一行。
  这里简单总结一下,客户端调用TCLIService.thrift协议中的完成接口流程:
  1.OpenSession
  2.FetchResults
  3.CloseOperation
  4.ExecuteStatement
  5.GetOperationStatus
  6.GetResultSetMetadata
  7.FetchResults
  8.CloseOperation
  9.CloseSession
  如果连接已经建立后,这里只会调用上面中的2-8流程。
 

hive中beeline取回数据的完整流程的更多相关文章

  1. Hive中的HiveServer2、Beeline及数据的压缩和存储

    1.使用HiveServer2及Beeline HiveServer2的作用:将hive变成一种server服务对外开放,多个客户端可以连接. 启动namenode.datanode.resource ...

  2. hive中grouping sets的使用

    hive中grouping sets 数量较多时如何处理?    可以使用如下设置来 set hive.new.job.grouping.set.cardinality = 30; 这条设置的意义在于 ...

  3. CSS从大图中抠取小图完整教程(background-position应用)

    CSS从大图中抠取小图完整教程(background-position应用)  转自: http://www.cnblogs.com/iyangyuan/archive/2013/06/01/3111 ...

  4. SQL Server中CURD语句的锁流程分析

    我只在数据库选项已开启“行版本控制的已提交读”(READ_COMMITTED_SNAPSHOT为ON)中进行了观察. 因此只适用于这种环境的数据库. 该类数据库支持四种不同事务隔离级别,下面分别观察数 ...

  5. Hive中Join的原理和机制

    转自:http://lxw1234.com/archives/2015/06/313.htm 笼统的说,Hive中的Join可分为Common Join(Reduce阶段完成join)和Map Joi ...

  6. Grunt搭建自动化web前端开发环境--完整流程

    Grunt搭建自动化web前端开发环境-完整流程 jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前 ...

  7. 关于sparksql操作hive,读取本地csv文件并以parquet的形式装入hive中

    说明:spark版本:2.2.0 hive版本:1.2.1 需求: 有本地csv格式的一个文件,格式为${当天日期}visit.txt,例如20180707visit.txt,现在需要将其通过spar ...

  8. hive中数据存储格式对比:textfile,parquent,orc,thrift,avro,protubuf

    这篇文章我会从业务中关注的: 1. 存储大小 2.查询效率 3.是否支持表结构变更既数据版本变迁 5.能否避免分隔符问题 6.优势和劣势总结 几方面完整的介绍下hive中数据以下几种数据格式:text ...

  9. Hive中自定义Map/Reduce示例 In Java

    Hive支持自定义map与reduce script.接下来我用一个简单的wordcount例子加以说明. 如果自己使用Java开发,需要处理System.in,System,out以及key/val ...

随机推荐

  1. 从svn迁移至Git并保留所有 commit 记录

    用户映射文件user.txt,等号左边为svn账号,右边为Git用户名和邮箱.注意:svn中有多少用户就要映射多少 test1=test1<147258369@qq.com>test2=t ...

  2. Centos6.5系统关闭防火墙

    关闭Centos6.5系统防火墙步骤: 1.命令:service iptables stop //停止正在运行的防火墙服务 2.命令:chkconfig iptables off //永久关闭防火墙 ...

  3. [原创]大数据:布隆过滤器C#版简单实现。

    public class BloomFilter { public BitArray _BloomArray; public Int64 BloomArryLength { get; } public ...

  4. cmd命令中运行pytest命令导入模块报错解决方法

    报错截图 ImportError while loading conftest 'E:\python\HuaFansApi\test_case\conftest.py'. test_case\conf ...

  5. 微软开源大规模数据处理项目 Data Accelerator

    微软开源了一个原为内部使用的大规模数据处理项目 Data Accelerator.自 2017 年开发以来,该项目已经大规模应用在各种微软产品工作管道上. 据微软官方开源博客介绍,Data Accel ...

  6. python文件的路径问题补充上一篇内容

    上次的路径问题还没解决就被勒索病毒的木马器给搞了两周多, 拖拖拖到现在又开始纠结路径问题...还是学习能力不足啊... 补充一下路径问题的知识, 毕竟jupyter notebook跟IDE测试的时候 ...

  7. DCDC设计指南二

    DCDC电源设计指导:二 这一讲以一款SOP-8封装的Synchronous Step-Down Converter(同步降压转换器)电源IC为例,讲下电源的PCB设计. 如第一讲中所说,开始设计时就 ...

  8. vue 学习小记

    vue 中有 data() .computed.methods.beforeRouteLeave.created等 具体的: data():定义一些文件中需要用到的变量,data中带return,是使 ...

  9. kubernates使用kubeadm安装

    kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验k ...

  10. vue的环境安装(一node环境)

    话不多说都知道vue是基于node环境的.肯定是要安装node环境的 1.node官网下载https://nodejs.org/en/download/对应的版本我的是win的 2.双击下载下来的安装 ...