JDBC连接Hive获取YARN application_id和进度信息

本文介绍了一种通过启动独立线程轮询YARN日志,记录每次合并操作的YARN application信息的方法。核心实现利用了Hive的QueryLog获取功能,通过解析日志中的特定信息来跟踪和记录YARN job的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写了一个初版,目前线上在跑,目的是记录每次合并的yarn application信息

原理其实就是新起一个线程去轮询yarn日志

核心代码如下:

    /**
     * 执行合并sql
     */
    private String execute(IntegrationMergeLog mergeLog, String sql) {
        // 数据库地址
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            Class.forName(hiveDriver);
            conn = DriverManager.getConnection(hiveUrl, hiveUsername, hivePassword);
            pstmt = conn.prepareStatement(sql);
            Thread logThread = new Thread(new LogRunnable((HiveStatement) pstmt, mergeLog));
            logThread.setDaemon(true);
            logThread.start();
            pstmt.execute();
            return "";
        } catch (Exception e) {
            log.error(sql, e);
            return e.getMessage();
        } finally {
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }


    /**
     * @author Bob
     * @description 进度信息的轮询线程实现
     * @date 2020/7/23
     */
    static class LogRunnable implements Runnable {
        private final HiveStatement hiveStatement;
        private IntegrationMergeLog mergeLog;

        LogRunnable(HiveStatement hiveStatement, IntegrationMergeLog mergeLog) {
            this.hiveStatement = hiveStatement;
            this.mergeLog = mergeLog;
        }

        private void updateQueryLog() {
            try {
                List<String> queryLogs = hiveStatement.getQueryLog();
                for (String queryLog : queryLogs) {
                    log.info("{}进度信息-->{}", Thread.currentThread().getName(), queryLog);
                    if (queryLog.contains("INFO  : The url to track the job:")) {
                        String job = queryLog.substring(queryLog.indexOf("INFO  : The url to track the job:") + 34);
                        if (mergeLog.getYarnApplication() == null) {
                            mergeLog.setYarnApplication(job);
                        } else if (!mergeLog.getYarnApplication().contains(job)) {
                            mergeLog.setYarnApplication(mergeLog.getYarnApplication() + "\n" + job);
                        }
                    }
                }
            } catch (Exception e) {

            }
        }

        @Override
        public void run() {
            try {
                while (hiveStatement.hasMoreLogs()) {
                    updateQueryLog();
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.getStackTrace();
            }
        }
    }

结果:

2020-07-23 16:48:06:060|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Query ID = hive_20200723164848_901487c3-d93a-4c65-b556-08870deb809f
2020-07-23 16:48:06:060|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Total jobs = 1
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Launching Job 1 out of 1
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Starting task [Stage-1:MAPRED] in serial mode
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Number of reduce tasks not specified. Estimated from input data size: 1
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : In order to change the average load for a reducer (in bytes):
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  :   set hive.exec.reducers.bytes.per.reducer=<number>
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : In order to limit the maximum number of reducers:
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  :   set hive.exec.reducers.max=<number>
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : In order to set a constant number of reducers:
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  :   set mapreduce.job.reduces=<number>
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : number of splits:1
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Submitting tokens for job: job_1595332030231_0061
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : The url to track the job: http://yy-t-bigdata1.xxx.com:8088/proxy/application_1595332030231_0061/
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Starting Job = job_1595332030231_0061, Tracking URL = http://yy-t-bigdata1.xxx.com:8088/proxy/application_1595332030231_0061/
2020-07-23 16:48:06:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Kill Command = /opt/cloudera/parcels/CDH-5.16.1-1.cdh5.16.1.p0.3/lib/hadoop/bin/hadoop job  -kill job_1595332030231_0061
2020-07-23 16:48:11:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1
2020-07-23 16:48:11:061|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : 2020-07-23 16:48:33,715 Stage-1 map = 0%,  reduce = 0%
2020-07-23 16:48:21:070|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : 2020-07-23 16:48:40,006 Stage-1 map = 100%,  reduce = 0%, Cumulative CPU 2.75 sec
2020-07-23 16:48:26:074|INFO |Thread-6||com.xxx.dataintegration.tools.service.impl.ViewCreateServiceImpl-277| - Thread-6进度信息-->INFO  : 2020-07-23 16:48:48,353 Stage-1 map = 100%,  reduce = 100%, Cumulative CPU 7.67 sec

参考:

https://blog.youkuaiyun.com/supperman_009/article/details/77508354

https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-HiveServer2Logging

 
### 设置或查看 Hive 使用 Tez 引擎时的作业名称 在使用 Apache Hive 并配置其基于 Apache Tez 执行引擎的情况下,可以通过多种方法设置查看 Tez 作业的名称。Tez 是一种高效的分布式计算框架,通常用于替代传统的 MapReduce 来提升复杂查询的性能。 #### 设置 Tez Job 名称 为了便于管理跟踪提交到集群中的 Tez 任务,可以显式地为每个 Hive 查询关联一个可读性强的应用程序名。这一目标可通过如下两种主要途径达成: 1. **通过 CLI 参数指定** 当借助 Beeline 工具向远程 HiveServer 发送请求时,可以在启动会话前或者执行具体语句之前加入相应的环境变量声明。例如: ```bash beeline -u jdbc:hive2://<host>:<port> --hivevar TEZ_JOB_NAME="MyCustomTezJob" ``` 此处定义了一个名为 `TEZ_JOB_NAME` 的宏,并赋予它期望显示的文字串作为后续生成日志记录的一部分[^3]。 2. **内部 Session 变量调节** 更加灵活的方式是在进入交互界面之后即时更改当前上下文中涉及的相关参数值。即运行以下命令之一即可生效直至退出连接为止: ```sql SET tez.session.name='Descriptive_Tez_Session_Name'; ``` 或者更通用的形式适用于单次独立调用而非整个生命周期范围内的重命名需求: ```sql SET mapreduce.job.name='Explicitly_Named_Hive_Query_via_Tez'; ``` 值得注意的是尽管后者语法形式沿用了旧版 MR API 风格但它同样兼容现代 Tez 实现路径下正常解析传递给底层调度组件加以体现最终呈现效果一致[^4]。 #### 查看已有的 Tez Job 名称 一旦成功设置了个性化的标签描述符后,在任何支持标准 Hadoop/YARN 架构监控平台之上均能够轻松定位对应条目并获取详尽统计资料反馈信息。常规做法包括但不限于以下几个方面: - 登录至 ResourceManager WebUI 页面浏览 Active Applications 列表查找匹配词条; - 利用 command-line utilities 如 `yarn application -list` 输出筛选符合条件的结果集合; - 结合 Ambari/Ganglia 等第三方运维套件图形化仪表板直观展现资源分配状况分布趋势图表等等[^5]。 另外值得一提的小技巧在于如果仅仅关心最近一段时间范围内产生的活动痕迹则可以直接附加时间戳限定条件缩小搜索空间从而加快响应速度减少冗余干扰项影响程度达到事半功倍的效果。 ```bash yarn application -list -appStates RUNNING -timeTaken 60m | grep "Your_Custom_Pattern" ``` --- ### 示例代码展示 这里给出一段完整的示范脚本帮助理解上述概念的实际运用场景: ```sql -- 开启 Tez 模式 SET hive.execution.engine=tez; -- 自定义本次操作对应的标识字符串 SET tez.session.name='Batch_Processing_of_Sales_Data'; -- 创建临时测试表格结构 DROP TABLE IF EXISTS sales_data; CREATE EXTERNAL TABLE IF NOT EXISTS sales_data ( transaction_id BIGINT, product_name STRING, quantity INT, price DOUBLE ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/tmp/sales/'; -- 加载模拟样本文件内容填充进去 LOAD DATA INPATH '/example/input/sample-sales.txt' OVERWRITE INTO TABLE sales_data; -- 计算总销售额排名前十的商品清单 SELECT product_name, SUM(quantity * price) AS total_sales FROM sales_data GROUP BY product_name ORDER BY total_sales DESC LIMIT 10; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值