这里我们从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. kityminder-editor + MongoDB 思维导图数据自动实时保存方案

    最近开始做自己的第一个开源项目:一个基于思维导图的测试用例管理系统MinderCase,在做了一周的技术调研后,决定采用kityminder-editor作为思维导图编辑器,为了支持实时存储,当思维导 ...

  2. xss攻击与防御

    一.XSS攻击 Cross Site Scripting跨站脚本攻击 利用js和DOM攻击. 盗用cookie,获取敏感信息 破坏正常页面结构,插入恶意内容(广告..) 劫持前端逻辑 DDos攻击效果 ...

  3. SSH免密登录实现

    现在先想要把项目部署到linux系统中 通过使用maven添加tomcat插件可以做到,右击项目 配置这里的url,是部署到哪里的意思(比如我们现在将这个项目部署到以下系统的tomcat中) 此处只有 ...

  4. Vue面试中,经常会被问到的面试题/Vue知识点整理

    一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写.Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑.View 代表UI 组件,它负责将数 ...

  5. Wish-递推DP记数

    链接:https://nanti.jisuanke.com/t/35618 题意: 如果一个数大于等于 1010 且任意连续两位都是质数,那么就称之为 Wish 数.当然,第一个 Wish 数是 11 ...

  6. vijos搭建踩坑

    nodejs我用的8.x版本,可以工作. 和制作组交谈之后他们说最好榨汁机和主机不要在同一系统下. vj4/vj4/handler/base.py的第343行 从 super(Connection, ...

  7. 查看Oracle中存储过程长时间被卡住的原因

    1:查V$DB_OBJECT_CACHE SELECT * FROM V$DB_OBJECT_CACHE WHERE name='CUX_OE_ORDER_RPT_PKG' AND LOCKS!='0 ...

  8. php GD库快速消耗CPU资源漏洞 CVE-2018-5711测试

    漏洞说明: 用一张GIF图片就可导致服务器发生崩溃直至宕机,在现实中非常容易利用. 影响版本: PHP 5 < 5.6.33 PHP 7.0 < 7.0.27 PHP 7.1 < 7 ...

  9. 微信小程序中的AJAX——POST,GET区别

    注意:发送服务器时的DATA 最终发送给服务器的数据是 String 类型,如果传入的 data 不是 String 类型,会被转换成 String .转换规则如下: 对于 GET 方法的数据,会将数 ...

  10. 20175324 《Java程序设计》第七周学习总结

    教材学习内容总结 常用实用类 String类 - 程序可以直接使用String类,但不能进行扩展,即String类不可以有子类 - 常用构造方法 - String(char a[])用一个字符数组a创 ...