Java客户端读取Hive 3.0任务进度(二)

本文介绍了一种利用Hive的Hook机制和YARN接口动态获取并监控Hive任务进度的方法。通过在Hive任务中嵌入特定标识,与Java客户端交互,实现了任务进度的实时读取。

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

上文说道,我们初步的思路是通过HIve的日志和yarn的接口获取任务进度。

可能用到的其他知识:

Hook介绍

Hive添加Jar

在实际的执行过程中,我遇到一个问题:在代码中写死的yarn的接口,如果yarn的服务地址发生改变怎么办?如果面对多个不同的yarn集群怎么办?可见我们需要动态的yarn的接口地址。

如何获取yarn集群的地址?

首先需要明白的是,Hive一定知道yarn集群地址。我突然想到Hive中提供了Hook的钩子(在Hive相应的阶段,执行对应的Jar包的方法)。通过Hook我们可以在项目执行之前,获取到任务的提交的yarn集群地址。然后在通过访问我们Java客户端提供的接口,将yarn集群的地址以JSON的格式发过来。

最终思路

  1. Java客户端提交任务给Hive集群,Hive执行Hook钩子,将yarn集群地址发送到Java客户端的接口。
  2. Java客户端获取到yarn集群地址,Java客户端读取Hive的日志,获取到任务id。
  3. 通过yarn集群地址和任务Id,由yarn的接口获取到相应的任务进度。

编码

Java客户端读取任务进度类

public class HiveTaskProgressServer {
   

    private  HiveStatement hiveStatement;

    /**
     *  停止线程的标志,true代表停止
     *
     */
    private Boolean isStop=false;

    public HiveStatement getHiveStatement() {
   
        return hiveStatement;
    }

    public void setHiveStatement(HiveStatement hiveStatement) {
   
        this.hiveStatement = hiveStatement;
    }

    public Boolean getStop() {
   
        return isStop;
    }

    public void setStop(Boolean stop) {
   
        isStop = stop;
    }

    /**
     * 功能描述:
     *      检索日志是否输出appId
     * @author twalk
     * @date 2018/12/9 11:08 PM
     * @param
     * @return
     */
    private String updateQueryLog() {
   
        try {
   
            List<String> queryLogs = hiveStatement.getQueryLog();
            for (String log : queryLogs) {
   
                System.out.println("进度信息-->"+log);
                // 获取appId
                if(log.indexOf("Status: Running (Executing on YARN cluster with App id")>-1){
   
                    String[] strings = log.split("application");
                    String appId = "application"+strings[strings.length-1].split("\\)")[0];
                    return appId;
                }
            }
        }
        catch (Exception e) {
   
            System.out.println(e);
        }
        return null;
    }

    /**
     * 功能描述:
     *      异步获取hive任务的进度
     * @author twalk
     * @date 2018/12/10 12:06 AM
     * @param taskId
     *          任务的id
     * @param taskType
     *          任务的类型
     * @return
     */
    @Async(value = "asyncServiceExecutor")
    public</
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值