文档章节

hive JDBC 进度和日志查看

OttoWu
 OttoWu
发布于 2016/07/04 18:00
字数 555
阅读 1W
收藏 3

精选30+云产品,助力企业轻松上云!>>>

hive JDBC 进度和日志查看

@(hive)[JDBC|进度|日志] hive的JDBC提供了java连接hiveserver2查询的能力,但是hive JDBC有别于关系型数据库,一个查询语句可能要在十几分钟到几十分钟才会返回结果,而hive JDBC并不会实时显示进度和日志,这样在查询的时候对用户不是很友好,需要在执行sql的时候显示进度。

在后台查看hiverserver2的日志中发现,其实hiveserver2在执行一个sql查询的时候是会捕捉到MR运行的进度和日志的,所以只要能把hiverser2获取到MR进度的日志捕捉到,就能实现显示进度的功能。在之前的hive 0.70.9版本中我们是直接修改了hive-jdbc的源码来实现日志和数据的分离和重定向显示。在hive 1.1.0中其实已经有了可以获取进度的API了,分别是HiveStatement中的 List<String> getQueryLog()List<String> getQueryLog(boolean incremental, int fetchSize)boolean hasMoreLogs()三个方法,借助这三个方法,就可以实时显示sql 查询进度。

完整API地址为 ---HiveStatement

具体实现如下

	// 代码不完整,仅供参考
	public class HiveExecuter {
	
    static Statement stmt = null;

    static class GetLogThread extends Thread {

        public void run() { //真生的输出运行进度的thread
            if (stmt == null) {
                return;
            }
            HiveStatement hiveStatement = (HiveStatement) stmt;
            try {
                while (!hiveStatement.isClosed() && ((HiveStatement) stmt).hasMoreLogs()) {
                    try {
                        for (String log : ((HiveStatement) stmt).getQueryLog(true, 100)) {
                            System.out.println(log);
                        }
                        Thread.currentThread().sleep(500L);
                    } catch (SQLException e) { //防止while里面报错,导致一直退不出循环
                        e.printStackTrace();
                        return;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        return;
                    }
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        // ... 一些初始化
        // 加载数据连接
        try {
            Class.forName("org.apache.hive.jdbc.HiveDriver");
            connection = DriverManager.getConnection(hiveConnection, username, "");
            stmt = connection.createStatement();

            new GetLogThread().start();
            rs = stmt.executeQuery(preSql);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }

                if (connection != null && !connection.isClosed()) {
                    connection.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
OttoWu
粉丝 5
博文 21
码字总数 40773
作品 0
杭州
私信 提问
加载中
请先登录后再评论。

暂无文章

生日悖论是啥?我用它省了上百G的内存

生日悖论: 是指在不少于 23 个人中至少有两人生日相同的概率大于 50%。例如在一个 30 人的小学班级中,存在两人生日相同的概率为 70%。对于 60 人的大班,这种概率要大于 99%。从引起逻辑矛盾...

osc_i2zebhtf
48分钟前
9
0
【蓝桥杯】2018年第九届蓝桥杯C/C++B组省赛——C题 承压计算

题目 标题:承压计算X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。每块金属原料的外形、尺寸完全一致,但重量不同。金属材料被严格地堆放成金字塔形。 ...

osc_knx03fpr
50分钟前
14
0
node.js/npm升级正确操作(windows和linux均有)

原文地址:https://www.wjcms.net/archives/nodejsnpm升级正确操作windows和linux均有 今天我们总结一下node.js以及npm升级的正确操作方法。 小编亲身经历可以用以下几步解决node版本问题及跳...

osc_7ac8o6u9
51分钟前
7
0
使用IDEA实现SSM整合(Maven+Spring+Mybatis+SpringMvc)

我是阿福,公众号「阿福聊编程」作者,一个在后端技术路上摸盘滚打的程序员,在进阶的路上,共勉! 文章已收录在 JavaSharing 中,包含Java技术文章,面试指南,资源分享。 本文是基于Maven...

阿福聊编程
51分钟前
9
0
手把手教你使用Python抓取QQ音乐数据(第四弹)

【一、项目目标】 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名、专辑名、播放链接。 通过手把手教你使用Python抓取QQ音乐...

osc_9na1lmr9
53分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部