这里我们从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. RxJS操作符(三)

    一.过滤类操作符:debounce, debounceTime 跟时间相关的过滤 debounceTime自动完成:性能,避免每次请求都往出发 ); debounce中间传入Observable co ...

  2. About The Order of The Declarations And Definition When Making a Member Function a Friend.关于使类成员成为另一个类友元函数的声明顺序和定义。

    If only member function clear of WindowMgr is a friend of Screen, there are some points need to note ...

  3. hadoop部署

    [root@xiong ~]# hostnamectl set-hostname hadoop001 [root@xiong ~]# vim /etc/hostnamehadoop001 vim /e ...

  4. C# Aspose.Cells 如何设置单元格样式

    //Instantiating a Workbook object Workbook workbook = new Workbook(); //Adding a new worksheet to th ...

  5. C - Thief in a Shop - dp完全背包-FFT生成函数

    C - Thief in a Shop 思路 :严格的控制好k的这个数量,这就是个裸完全背包问题.(复杂度最极端会到1e9) 他们随意原来随意组合的方案,与他们都减去 最小的 一个 a[ i ] 组合 ...

  6. Metasploit运行环境内存不要低于2GB

    Metasploit运行环境内存不要低于2GB  Metasploit启用的时候,会占用大量的内存.如果所在系统剩余内存不足(非磁盘剩余空间),会直接导致运行出错.这种情况特别容易发生在虚拟机Kali ...

  7. Stream闪亮登场

    Stream闪亮登场 一. Stream(流)是什么,干什么 Stream是一类用于替代对集合操作的工具类+Lambda式编程,他可以替代现有的遍历.过滤.求和.求最值.排序.转换等 二. Strea ...

  8. 2018-2019-2 网络对抗技术 20162329 Exp3 免杀原理与实践

    目录 免杀原理与实践 一.基础问题回答 1.杀软是如何检测出恶意代码的? 2.免杀是做什么? 3.免杀的基本方法有哪些? 二.实验内容 1. 正确使用msf编码器 2. msfvenom生成如jar之 ...

  9. 关于阿里ICON矢量图(SVG)上传问题.

    注意点: 1. 存储为svg格式(建议使用存储为svg,不要使用导出为svg)2. 图像位置:链接(注意哦,不要点嵌入和保留编辑功能)---确定3. AI里面选中图形,点对象-路径-轮廓化描边 软件编 ...

  10. mac效率工具

    前言:在命令行中切换目录是最常用的操作,我相信一遍又一遍重复“cd ls cd ls cd ls ……”绝对会让你抓狂. 记录一下,方便下次系统重装,哈哈 一. oh-my-zsh mac 预装了 z ...