这里我们从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. RabbitMQ一个简单可靠的方案(.Net Core实现)

    前言 最近需要使用到消息队列相关技术,于是重新接触RabbitMQ.其中遇到了不少可靠性方面的问题,归纳了一下,大概有以下几种: 1. 临时异常,如数据库网络闪断.http请求临时失效等: 2. 时序 ...

  2. Node.js 操作 OSX 系统麦克风、扬声器音量

    最近几年 Electron 很火,公司也正好有个项目想做跨平台客户端,大家研究了一下就选择了 Electron,第一次做 js 的项目遇到了不少坑,不过也都一点点解决了. 因为项目中需要对用户录音,H ...

  3. kafka+zookeeper集群

    参考:  kafka中文文档   快速搭建kafka+zookeeper高可用集群   kafka+zookeeper集群搭建 kafka+zookeeper集群部署 kafka集群部署   kafk ...

  4. C语言作业06--结构体&文件

    1.本章学习总结 1.1 思维导图 1.2学习体会 在本周的学习中,我们学习了关于结构体和文件的内容.定义结构体可以使代码整个练习更加紧密,非常实用,当我们需要在对一个个体的不同属性调用时可以更加系统 ...

  5. ES6躬行记(15)——箭头函数和尾调用优化

    一.箭头函数 箭头函数(Arrow Function)是ES6提供的一个很实用的新功能,与普通函数相比,不但在语法上更为简洁,而且在使用时也有更多注意点,下面列出了其中的三点: (1)由于不能作为构造 ...

  6. 2019北航oo课程第二单元作业总结..#_#..

    学习了之前在写代码是从来没有见过的多线程之后,便迎来了此次电梯作业.说实话,这次作业做得十分的辛苦,虽然在前三次作业中领悟到了java面向对象的精髓,但是再加上了多线程之后,又开始理不清思路,对自己的 ...

  7. js中将字符串作为函数名来调用的方法

    方法:eval() eg: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. vue-cli 2篇官方文档记录收藏

    https://cli.vuejs.org/guide/ http://vuejs-templates.github.io/webpack/

  9. JS for循环 if判断、white循环。小练习二

    假设一个简单的ATM机的取款过程是这样的:首先提示用户输入密码(password),最多只能输入三次,超过3次则提示用户“密码错误,请取卡”结束交易.如果用户密码正确,再提示用户输入取款金额(amou ...

  10. css 制作导航条布局

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...