通过Hive JDBC提交的查询, 如何获取其在Yarn上的Application ID

  • 数据平台上需要封装Hive查询,只提供API给业务方使用,代码中通过Hive JDBC完成将查询语句向Hive提交,等待执行完成,结果解析的功能.
  • 用户提交查询之后意识到查询语句错误(非语法错误),不想等待错误的语句执行完成后再次提交. 由于用户没有yarn client的权限,kill task的操作也需要通过API提供,因此在提交查询语句时需要获取其在Yarn上的Application Id.
  • Hive在执行层面加装了Tez,不是那个最初的Hive了.

两种思路

在网上研究了一番之后,思路主要有两种:

  1. 利用HiveStatement获取查询日志后进行解析,得到Application Id
  2. 提交查询的时候,为查询附上唯一标识符,通过该标识符找到Application Id

第一种思路实现起来简单,但是不够优雅,而且在并发查询的情况下会是什么效果没有测试过.

第二种查询由于Tez的原因,尝试了很多种方案,都不能有效的设置查询标识符.

该功能测试的通用连接代码如下:

private static String driverName = "org.apache.hive.jdbc.HiveDriver";
Class.forName(driverName);

String url = "jdbc:hive2://<host>:10000/<database>";

Properties info = new Properties();
info.setProperty("user", "bigdata");
info.setProperty("password", "******");

Connection conn = DriverManager.getConnection(url, info);
HiveStatement stmt = (HiveStatement) conn.createStatement();
String table = "table_name";
ResultSet result = stmt.executeQuery("SELECT COUNT(*) FROM " + table);

解析查询日志

  • 需要另外起一个线程用于日志的获取(等到查询执行完,就不用实现kill的功能了)
  • 并发查询的时候,如何确认获取到的日志就是某个查询的日志呢?

日志解析的Java代码如下:

String yarn_app_id = "";
for (String log : stmt.getQueryLog()) {
    if (log.contains("App id")) {
        yarn_app_id = log.substring(log.indexOf("App id") + 7, log.length(
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值