请注意,这个Application的name不是固定的,所以你上面的程序不符合我的需求。请给出完整的程序

时间: 2024-02-20 21:00:44 浏览: 18
好的,我理解了。那么我可以修改一下代码,在获取任务信息时,使用正则表达式匹配任务名称。以下是完整的程序: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.yarn.api.ApplicationBaseProtocol; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.ApplicationReport; import org.apache.hadoop.yarn.client.api.YarnClient; import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.exceptions.YarnException; import java.io.IOException; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class HiveSQLCircuitBreaker { private static final int THREAD_POOL_SIZE = 1; private static final int CHECK_INTERVAL_SECONDS = 60; private static final int THRESHOLD = 100; private static final String TASK_NAME_PATTERN = ".*HiveSQL.*"; private static volatile boolean running = true; private static final Configuration conf = new YarnConfiguration(); public static void main(String[] args) { YarnClient yarnClient = YarnClient.createYarnClient(); yarnClient.init(conf); yarnClient.start(); ExecutorService executor = Executors.newFixedThreadPool(THREAD_POOL_SIZE); executor.submit(() -> { while (running) { try { checkTempFiles(yarnClient); Thread.sleep(CHECK_INTERVAL_SECONDS * 1000L); } catch (InterruptedException e) { // ignore } } }); // 等待程序退出 Runtime.getRuntime().addShutdownHook(new Thread(() -> { running = false; executor.shutdown(); try { yarnClient.stop(); } catch (YarnException | IOException e) { e.printStackTrace(); } })); } private static void checkTempFiles(YarnClient yarnClient) throws YarnException, IOException { List<ApplicationReport> apps = yarnClient.getApplications(); for (ApplicationReport app : apps) { if (app.getName().matches(TASK_NAME_PATTERN)) { // 获取应用程序ID ApplicationId appId = app.getApplicationId(); // 获取任务ID String taskId = appId.toString(); // 获取临时文件路径 List<String> tempFiles = getTempFiles(appId); // 判断临时文件是否超出阈值 if (tempFiles.size() > THRESHOLD) { // 杀死任务 killTask(taskId); } } } } private static List<String> getTempFiles(ApplicationId appId) throws IOException { Configuration conf = new YarnConfiguration(); ApplicationBaseProtocol client = ApplicationClientProtocolProvider.createProtocolProxy(conf, appId); String[] logDirs = conf.getStrings(YarnConfiguration.NM_LOG_DIRS); StringBuilder sb = new StringBuilder(); for (String logDir : logDirs) { sb.append(logDir).append(','); } sb.deleteCharAt(sb.length() - 1); String[] appDirs = new String[]{sb.toString() + "/application_" + appId.getId()}; List<String> tempFiles = new ArrayList<>(); for (String appDir : appDirs) { Path tempPath = new Path(appDir, "tmp"); FileSystem fs = tempPath.getFileSystem(conf); if (fs.exists(tempPath)) { FileStatus[] statuses = fs.listStatus(tempPath); for (FileStatus status : statuses) { if (status.getPath().getName().startsWith("hive_")) { tempFiles.add(status.getPath().toString()); } } } } return tempFiles; } private static void killTask(String taskId) throws IOException, YarnException { YarnClient yarnClient = YarnClient.createYarnClient(); yarnClient.init(conf); yarnClient.start(); List<ApplicationReport> apps = yarnClient.getApplications(); for (ApplicationReport app : apps) { if (app.getApplicationId().toString().equals(taskId)) { yarnClient.killApplication(app.getApplicationId()); break; } } yarnClient.stop(); } } ``` 在这个程序中,我使用正则表达式 `".*HiveSQL.*"` 来匹配任务名称,如果任务名称包含 "HiveSQL" 字符串,则认为这是一个HiveSQL任务。同时,我将YARN客户端的初始化和关闭放在了程序的全局范围内,这样可以避免在每次循环中都重新创建和销毁客户端对象,从而提高程序的效率。

相关推荐

最新推荐

recommend-type

JAVA程序设计判断题题库81道

《java程序设计》课程的题库资料,由贺州学院整理,可供学生期末课程复习使用,也可以供相关任课教师出卷使用。 内容示例为: 1. JAVA的源代码中定义几个类,编译结果就生成几个以“.class”为后缀的字节码文件。( ...
recommend-type

IDEA WEB项目启动不加载application.properties配置文件.docx

IDEA WEB项目启动不加载application.properties配置文件,yml配置文件是否也会不加载未尝试,如果有遇到的可以尝试一下。
recommend-type

Springboot为什么加载不上application.yml的配置文件

主要介绍了Springboot为什么加载不上application.yml的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
recommend-type

Application程序,在Frame中加入2个按钮(Button)和1个标签(Label)

编写,在Frame中加入2个按钮(Button)和1个标签(Label),单击两个按钮,显示按钮的标签于Label。
recommend-type

C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法

主要介绍了C# WinForm程序处理后台繁忙导致前台控件假死现象解决方法,本文通过Application.DoEvents()解决这个问题,并讲解了Application.DoEvents()的作用,需要的朋友可以参考下
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。