这里我们从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. Oracle 正则表达式 分割字符串

    inData='12345|张三|男' SELECT REGEXP_SUBSTR (inData, '[^|]+', 1,1) into 用户ID FROM DUAL;SELECT REGEXP_SU ...

  2. [转] 使用Node.js实现简易MVC框架

    在使用Node.js搭建静态资源服务器一文中我们完成了服务器对静态资源请求的处理,但并未涉及动态请求,目前还无法根据客户端发出的不同请求而返回个性化的内容.单靠静态资源岂能撑得起这些复杂的网站应用,本 ...

  3. 单机千万级MQTT连接服务器测试报告

    目标:测试创建1000万客户端连接到服务器端,服务器操作系统 Linux(任意一款发行版服务器版本).分别在两台硬件一样的服务器,其中一台用于服务器端运行,另一台用于创建千万客户端连接客户端机器.在硬 ...

  4. html_Dom

    Document: 每个载入浏览器的HTML文档都会成为一个Document对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 并且Document 对象是 Wi ...

  5. 部分手机浏览器存在将ajax请求当成广告过滤的情况,及解决方案

    我们发现h5页面在某些浏览器请求不到数据,经过排查,是浏览器的广告拦截模块搞的鬼. 通过删减参数,发现adtype和adnum参数去掉后,接口可以正常请求,开始以为是官方拦截关键词带有ad的参数,后来 ...

  6. MDK5 设置project targents?如何实现的有知道的请共享一下谢谢感激不尽!!!!

    就在刚刚阅读NRF51822相关的文档时遇到问题,官方给出了一份模板,我从我安装的example中找出了官方的列程,看到是soft config的方式配置的,于是根据列程的配置,自己新建了一个工程之后 ...

  7. Alpha冲刺(1/10)——2019.4.23

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...

  8. HBase数据库增删改查常用命令操作

    最近测试用到了Hbase数据库,新建一个学生表,对表进行增删改查操作,把常用命令贴出来分享给大家~ 官方API:https://hbase.apache.org/book.html#quickstar ...

  9. 平时作业六 java

    编写一个Java应用程序,使用Java的输入输出流技术将Input.txt的内容(Input.txt为文本文件)逐行读出,每读出一行就顺序为其添加行号(从1开始,逐行递增),并写入到另一个文本文件Ou ...

  10. Java实现生产者与消费者模式

    生产者不断向队列中添加数据,消费者不断从队列中获取数据.如果队列满了,则生产者不能添加数据:如果队列为空,则消费者不能获取数据.借助实现了BlockingQueue接口的LinkedBlockingQ ...