引言

 
目前数据平台使用Hadoop构建,为了方便数据分析师的工作,使用Hive对Hadoop MapReduce任务进行封装,我们面对的不再是一个个的MR任务,而是一条条的SQL语句。数据平台内部通过类似JDBC的接口与HiveServer进行交互,仅仅能够感知到一条SQL的开始与结束,而中间的这个过程通常是漫长的(两个因素:数据量、SQL复杂度),某些场景下用户需要了解这条SQL语句的执行进度,从而为我们引入以下几个问题:
 
(1)通过JDBC接口执行一条SQL语句时,这条SQL语句被转换成几个MR任务,每个MR任务的JobId是多少,如何维护这条SQL语句与MR任务的对应关系?
(2)如何获取MR任务的运行状态,通过JobClient?
(3)通过HiveServer是否可以获取到上述信息?
 
思路
 
当我们在终端下执行命令“hive”后,会看到有如下输出:
 
 
Hive有会话(Session)的概念,而这次会话中的所有日志消息将会输出到这个日志文件中,包含SQL语句的执行日志,查看这个日志文件可以看到以下信息:
 
 
 
QueryStart行日志包含QUERY_STRING、QUERY_ID。
 
 
TaskStart行日志包含TASK_ID、QUERY_ID。
 
 
TaskProgress行日志包含TASK_HADOOP_PROGRESS、TASK_ID、QUERY_ID、TASK_HADOOP_ID,其中TASK_HADOOP_PROGRESS中可以获取到map、reduce进度。
 
 
TaskEnd行日志包含TASK_HADOOP_PROGRESS、TASK_ID、QUERY_ID、TASK_HADOOP_ID。
 
 
QueryEnd行日志包含QUERY_STRING、QUERY_ID。
 
由上可知,QueryStart、TaskStart、TaskProgress、TaskEnd(一个复杂的Query可能会产生多个Task)、QueryEnd覆盖整个查询的执行过程,通过对这些行日志的解析,我们就可以获取到Hive SQL的执行状态。
 
此外,还有SessionStart、SessionEnd,由于使用过程中发现SessionEnd日志有时不被输出,因此没有使用这两个状态。
 
会话的日志文件存储在HiveServer的本地磁盘中,而实际应用中我们有多台HiveServer提供服务,因此我们需要能够统一收集所有HiveServer的会话日志。
 
通过对Hive源码的分析发现,每次Hive执行语句时都会执行一些“Hook”(PreHook),代码如下:
 
 
通过会话日志、PreHook,我们基本可以整理出以下思路:
 
在PreHook中启动线程监听会话日志的输出(类型Linux的tailf),将这些日志信息统一收集到某一服务中,统一处理后做进度展示。
 
实现
 
我们构建了一个Rest API服务,一部分用于接收由PreHook发送的会话日志信息,另一部分用于对外提供进度展示。
 
PreHook要求实现接口ExecuteWithHookContext,如下:
 
 
通过hookContext我们可以获取到以下信息:
 
QueryId:
 
 
QueryStr:
 
 
HadoopJobName:
 
 
Jobs:
 
 
HistFileName:
 
 
为了保证后续对会话日志的接收,我们需要在查询执行伊始就将上述信息发送给Rest API服务,如下:
 
 
 
然后就是对会话日志的输出监听(即tailer),我们使用Apache Commons IO中的Tailer完成些功能,如下:
 
 
Tailer实际上启动一个后台线程,并通过listener完成数据行的处理,而一次会话中可能执行多条查询语句,而每一次执行查询语句时都会导致PreHook的执行,因此我们需要避免同一会话中对histFileName多次“tailf”,需要维护已被“tailf”的文件,而且Tailer实例是需要被“stop”的,多数时候无法获取到SessionEnd数据行,需要通过其它方式能够终止会话已经消失的Tailer线程。为此专门设计了TailerTracker(单例,即TAILER_TRACKER)。
 
TailerTracker维护着一个记录列表:
 
 
 
 
维护着成对的tailer与listener实例,其中listener实例中维护着对应tailer实例中最后一次新数据产生的时间,如果tailer实例在设定的时间内都没有新数据产生,则应该对其执行stop,核心代码如下:
 
 
判断某一个会话文件是否已经被“tailer”,代码如下:
 
 
标记一个会话文件已经被“tailer”,代码如下:
 
 
会话日志数据行的输出实际由FileTailerListener(继承自TailerListenerAdapter)完成,代码如下:
 
 
每处理一行数据,都要更新一下时间戳lastHandleTime,而QueryStart、QueryEnd、TaskStart、TaskProgress、TaskEnd的数据行会通过不同的Rest API Post。
 
至此,HiveServer的会话日志收集过程完毕,而Rest服务则需要通过这些收集到的数据完成Hive SQL进度跟踪。
 
我们在通过JDBC接口与HiveServer交互时,是无法获取到QueryId的,但是我们可以通过属性mapred.job.name设置Hive SQL执行时的MR JobName,JobName代表查询名称,需要唯一,同时我们需要维护JobName与QueryId的对应关系。
 
在Rest服务内部设计实现ProgressController,用以维护JobName与QueryId的对应关系,同时使用QueryId跟踪Hive SQL执行进度,核心变量如下:
 
 
目前Hive SQL的进度记录仅仅在内存里维护(超过一定时间后,这些进度信息便不再有价值),因此需要控制内存中进度记录的数量,这一点是通过记录每一条SQL相关进度信息的最后更新时间(lastUpdateTime)来实现的,过期即被清除。
 
lastUpdateTime:维护JobName(即某个查询)记录最后更新时间;
 
jobNameToQueryId:维护JobName与QueryId的对应关系;
 
querys:维护QueryId与Hive SQL执行进度(QueryProgress)的对应关系。
 
QueryProgress内部结构如下:
 
 
queryId:查询ID;
 
sql:查询语句;
 
jobs:查询被转换成MapRecude Job的数量;
 
taskProgresses:维护TaskId与MapReduce的执行进度的对应关系;
 
startTime:查询的起始时间;
 
stopTime:查询的终止时间;
 
state:查询状态。
 
TaskProgress内部结构如下:
 
 
taskId:TaskId(Stage-1、Stage-2、...);
 
taskHadoopId:Task对应的Hadoop MapReduce Job Id;
 
map:Hadoop MapReduce map进度百分比值;
 
reduce:Hadoop MapReduce reduce进度百分比值;
 
startTime:Task起始时间;
 
stopTime:Task截止时间;
 
state:Task运行状态。
 
当收到query/init的请求时,执行ProgressController queryInit方法,代码如下:
 
 
当收到query/start的请求时,执行ProgressController queryStart方法,代码如下:
 
 
 
当收到task/start的请求时,执行ProgressController taskStart方法,代码如下:
 
 
当收到task/progress的请求时,执行ProgressController taskProgress方法,代码如下:
 
 
当收到task/end的请求时,执行ProgressController taskEnd方法,代码如下:
 
 
当收到query/end的请求时,执行ProgressController queryEnd方法,代码如下:
 
 
其中ProgressController还承担着定时清理的工作,代码如下:
 
 
进度示例
 
 
 
不足
 
Hive SQL执行进度数据维护在内存中,而且Rest服务为单点。

Hive SQL运行状态监控(HiveSQLMonitor)的更多相关文章

  1. Hive SQL 监控系统 - Hive Falcon

    1.概述 在开发工作当中,提交 Hadoop 任务,任务的运行详情,这是我们所关心的,当业务并不复杂的时候,我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务.在编写 Hive SQ ...

  2. SQL Server监控清单

    SQL Server监控清单 一. 服务器1. 状态监控(1) 服务器是否可访问?(2) 相应的数据库服务是否启用?(3) 操作系统事件日志中的错误或告警(4) 磁盘可用空间 服务器状态监控,不管使用 ...

  3. Hive SQL语法总结

    Hive是一个数据仓库基础的应用工具,在Hadoop中用来处理结构化数据,它架构在Hadoop之上,通过SQL来对数据进行操作. Hive 查询操作过程严格遵守Hadoop MapReduce 的作业 ...

  4. SQL Server 监控系列(文章索引)

    一.前言(Introduction) SQL Server监控在很多时候可以帮助我们了解数据库做了些什么,比如谁谁在什么时候修改了表结构,谁谁在删除了某个对象,当这些事情发生了,老板在后面追着说这是谁 ...

  5. 【hive】——Hive sql语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  6. hive sql 语法详解

    Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQL查 ...

  7. Hive sql 语法解读

    一. 创建表 在官方的wiki里,example是这种: Sql代码   CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name d ...

  8. Spark(Hive) SQL中UDF的使用(Python)

    相对于使用MapReduce或者Spark Application的方式进行数据分析,使用Hive SQL或Spark SQL能为我们省去不少的代码工作量,而Hive SQL或Spark SQL本身内 ...

  9. Spark(Hive) SQL数据类型使用详解(Python)

    Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...

随机推荐

  1. 开发Mhealth(即:Mobile Health 移动医疗)应用必知的10个掘金点

    近 日,著名移动技术咨询公司Research2Guidance发布了最新版的<移动医疗应用开发者经济>报告.在过去的两年半里,iOS和Android 两大主流移动平台上的移动医疗应用(以下 ...

  2. 笔试之STL

    1. map是如何实现的?它的keys是否经过排序?如何实现它的clear方法? A 实现: map是通过红黑树来实现的,keys是经过排序的: map的所有元素都是pair,同时拥有实值(value ...

  3. Android(java)学习笔记224:横竖屏切换时Activity的生命周期

    1.横竖屏切换的生命周期     默认情况下横竖屏切换,先销毁再创建 2.有的时候,默认情况下的横竖屏切换(先销毁再创建),对应用户体验是不好的,比如是手机游戏横竖屏切换对游戏体验非常不好,下面两种方 ...

  4. 【开源java游戏框架libgdx专题】-07-文件处理

    介绍:文件处理在不同平台的文件管理是略有差异的 Desktop(Windows,Linux,Mac OS X等等):在桌面系统中,文件系统是一个大块的内存.文件可以通过当前的工作目录或者绝对路径被引用 ...

  5. 从一个SVN下载的导入另一个SVN里面

    如果项目是你从个一个SVN下载的,你想存入另一个SVN里面 那么问题来了 你用eclipse的team的时候会发现没有Team share 这个选项,那么就等于是没有上传的选项了 解决办法,把项目删掉 ...

  6. 关于Jquery.Data()和HTML标签的data-*属性

    人们总喜欢往HTML标签上添加自定义属性来存储和操作数据.但这样做的问题是,你不知道将来会不会有其它脚本把你的自定义属性给重置掉,此外,你这样做也会导致html语法上不符合Html规范,以及一些其它副 ...

  7. [转] 关于UIView

    [转载] 原文地址 :http://blog.csdn.net/itianyi/article/details/8982518 UIView是开发中使用得最多的控件了,深入的理解很有必要. UIVie ...

  8. http请求的cookie

    Cookie的作用: Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取. HTTP请求,Cookie的使用过程 1.server通过HTTP Response中的& ...

  9. archlinux的安装与简单配置(长期更新)

    安装部分较为较为简略,详细内容请查看arch的wiki 分区 cfdisk 格式化 mkfs.ext4 /dev/sdaX ... 挂载分区 mount /dev/sdaX /mnt ... 修改软件 ...

  10. nuc900 nand flash mtd 驱动

    nuc900 nand flash mtd 驱动,请参考! /* * Copyright © 2009 Nuvoton technology corporation. * * Wan ZongShun ...