- 数据平台上需要封装Hive查询,只提供API给业务方使用,代码中通过Hive JDBC完成将查询语句向Hive提交,等待执行完成,结果解析的功能.
- 用户提交查询之后意识到查询语句错误(非语法错误),不想等待错误的语句执行完成后再次提交. 由于用户没有yarn client的权限,kill task的操作也需要通过API提供,因此在提交查询语句时需要获取其在Yarn上的
Application Id.- Hive在执行层面加装了Tez,不是那个最初的Hive了.
两种思路
在网上研究了一番之后,思路主要有两种:
- 利用
HiveStatement获取查询日志后进行解析,得到Application Id - 提交查询的时候,为查询附上唯一标识符,通过该标识符找到
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(


3100

被折叠的 条评论
为什么被折叠?



