• 监控Spark运行超时及kill掉重跑


    在用oozie的调度任务,用shell调度spark任务,在生产环境运行时,正常1-2个小时跑完的任务,有时出现跑了5、6个小时还没跑完,造成的原因很奇怪,有可能是数据倾斜,任务占用太多资源偶尔出错。为了监控这种现象,并设定阈值为3个小时,如果超过3小时没跑完就kill掉。可以结合oozie失败重试机制实现重跑。

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. import java.util.regex.Matcher;
    4. import java.util.regex.Pattern;
    5. // 导入oozie的api相关的类
    6. import org.apache.hadoop.conf.Configuration;
    7. import org.apache.hadoop.yarn.api.records.ApplicationId;
    8. import org.apache.hadoop.yarn.api.records.ApplicationReport;
    9. import org.apache.hadoop.yarn.client.api.YarnClient;
    10. public class YarnJobMonitor {
    11. // 定义一个正则表达式,用于匹配作业的运行时间
    12. private static final Pattern DURATION_PATTERN = Pattern.compile("Duration\\s*:\\s*(\\d+) days, (\\d+) hours, (\\d+) minutes");
    13. // 定义一个常量,表示超时的阈值(3小时)
    14. private static final long TIMEOUT_THRESHOLD = 3 * 60 * 60 * 1000; // 3 hours in milliseconds
    15. public static void main(String[] args) throws Exception {
    16. // 创建一个Configuration对象,用于加载Hadoop和Yarn的配置文件
    17. Configuration conf = new Configuration();
    18. conf.addResource("core-site.xml");
    19. conf.addResource("hdfs-site.xml");
    20. conf.addResource("yarn-site.xml");
    21. // 创建一个YarnClient对象,用于访问Yarn的api
    22. YarnClient yarnClient = YarnClient.createYarnClient();
    23. yarnClient.init(conf);
    24. yarnClient.start();
    25. // 调用Yarn的api,获取所有正在运行的应用程序
    26. List<ApplicationReport> apps = yarnClient.getApplications(EnumSet.of(YarnApplicationState.RUNNING));
    27. // 遍历每个应用程序
    28. for (ApplicationReport app : apps) {
    29. // 获取应用程序的ID和名称
    30. ApplicationId appId = app.getApplicationId();
    31. String appName = app.getName();
    32. // 判断应用程序是否是由Oozie Shell命令启动的spark任务
    33. if (appName.startsWith("oozie:launcher")) {
    34. // 如果是,打印日志或者做其他操作
    35. System.out.println("Found Oozie Shell spark job: " + appId);
    36. // 获取应用程序的开始时间和当前时间
    37. long startTime = app.getStartTime();
    38. long currentTime = System.currentTimeMillis();
    39. // 计算应用程序的运行时间(毫秒)
    40. long jobDuration = currentTime - startTime;
    41. // 判断应用程序的运行时间是否超过阈值
    42. if (jobDuration > TIMEOUT_THRESHOLD) {
    43. // 如果超过阈值,调用Yarn的api,终止应用程序
    44. yarnClient.killApplication(appId);
    45. // 打印日志或者做其他操作
    46. System.out.println("Killed Oozie Shell spark job: " + appId);
    47. // 重新运行应用程序或者做其他操作
    48. // ...
    49. } else {
    50. // 如果没有超过阈值,打印日志或者做其他操作
    51. System.out.println("Job " + appId + " is running normally");
    52. }
    53. }
    54. }
    55. // 关闭YarnClient对象
    56. yarnClient.stop();
    57. }
    58. }
  • 相关阅读:
    奥特曼与钢铁侠【InsCode Stable Diffusion美图活动一期】
    YOLOv8/5不显示FLPOs
    qmake 手册:概述
    MySQL性能优化之buffer pool配置优化
    多测师肖sir_高级金牌讲师_python之结构语句005
    三个角度分解永磁同步电机发电工况
    redhat/centos 配置本地yum源
    Ground Truth
    redis中value/set
    RabbitMQ (4)
  • 原文地址:https://blog.csdn.net/linweidong/article/details/132645690