首页
/ Apache DolphinScheduler中Yarn任务管理的问题分析与解决方案

Apache DolphinScheduler中Yarn任务管理的问题分析与解决方案

2025-05-17 17:19:05作者:胡唯隽

问题背景

在Apache DolphinScheduler 3.2.1版本中,当用户尝试停止一个运行在YARN集群模式下的Flink任务时,系统会尝试通过YarnApplicationManager组件来终止对应的YARN应用。然而,在实际操作中,这一过程可能会遇到两个主要问题:

  1. YARN命令无法找到的错误
  2. 即使成功终止应用,系统日志中仍会记录错误信息

问题根源分析

YARN命令无法找到的问题

当DolphinScheduler尝试执行yarn命令来终止应用时,系统报错"yarn:未找到命令"。这主要是因为:

  1. 系统使用/bin/sh来执行终止脚本,而sh不会自动加载/etc/profile中的环境变量
  2. YARN命令的路径通常配置在/etc/profile或用户profile文件中
  3. 当前实现中缺少对环境变量的显式加载

终止成功但日志报错的问题

即使添加了环境变量加载后能够成功终止YARN应用,系统日志仍会记录错误信息。这是因为:

  1. YARN客户端在执行终止操作时会输出INFO级别的日志
  2. DolphinScheduler的AbstractShell组件将这些输出误判为错误信息
  3. 系统没有正确区分命令执行的实际结果和正常输出

解决方案

针对YARN命令无法找到的问题

修改YarnApplicationManager.execYarnKillCommand方法,在脚本中添加环境变量加载:

private void execYarnKillCommand(String tenantCode, String commandFile, String cmd) throws Exception {
    StringBuilder sb = new StringBuilder();
    sb.append("#!/bin/sh\n");
    sb.append("BASEDIR=$(cd `dirname $0`; pwd)\n");
    sb.append("cd $BASEDIR\n");
    sb.append("source /etc/profile\n");  // 添加环境变量加载
    sb.append("\n\n");
    sb.append(cmd);
    
    // 其余代码保持不变...
}

针对日志报错问题

这个问题需要从两个层面解决:

  1. 修改AbstractShell组件,使其能够正确识别命令执行结果
  2. 或者调整YARN命令的输出级别,避免INFO日志被误判为错误

深入探讨:YARN应用状态跟踪

当前DolphinScheduler对YARN应用的状态跟踪支持有限。要实现完整的应用状态跟踪,可以考虑以下实现方案:

public void trackApplicationStatus() throws TaskException {
    YarnClient yarnClient = YarnClient.createYarnClient();
    try {
        // 初始化YARN客户端配置
        YarnConfiguration conf = new YarnConfiguration();
        conf.addResource(new File(hadoopConfDir + "/hdfs-site.xml").toURI().toURL());
        conf.addResource(new File(hadoopConfDir + "/core-site.xml").toURI().toURL());
        conf.addResource(new File(hadoopConfDir + "/yarn-site.xml").toURI().toURL());
        yarnClient.init(conf);
        yarnClient.start();
        
        // 解析应用ID并跟踪状态
        ApplicationId applicationId = parseApplicationId(appIds);
        while (true) {
            ApplicationReport report = yarnClient.getApplicationReport(applicationId);
            YarnApplicationState state = report.getYarnApplicationState();
            
            if (state == YarnApplicationState.FAILED) {
                setExitStatusCode(TaskConstants.EXIT_CODE_FAILURE);
                break;
            } else if (state == YarnApplicationState.FINISHED || 
                      state == YarnApplicationState.KILLED) {
                break;
            }
            
            Thread.sleep(trackingInterval);
        }
    } finally {
        yarnClient.stop();
        yarnClient.close();
    }
}

最佳实践建议

  1. 环境配置:确保所有工作节点都正确配置了YARN命令路径
  2. 权限管理:检查执行用户是否有权限执行sudo和yarn命令
  3. 日志分析:区分真正的错误和正常的INFO级别输出
  4. 状态跟踪:对于需要跟踪YARN应用状态的任务,实现自定义的状态跟踪逻辑
  5. 版本适配:不同版本的DolphinScheduler中相关类的位置可能不同,注意检查

总结

Apache DolphinScheduler作为一款优秀的工作流调度系统,在YARN任务管理方面仍有改进空间。通过本文介绍的问题分析和解决方案,用户可以在现有版本基础上实现更稳定可靠的YARN任务管理功能。未来版本中,可以考虑增加对YARN应用状态的自动跟踪功能,提供更完善的任务管理体验。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
202
2.17 K
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
208
285
pytorchpytorch
Ascend Extension for PyTorch
Python
61
94
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
977
575
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
9
1
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
550
83
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
1.02 K
399
communitycommunity
本项目是CANN开源社区的核心管理仓库,包含社区的治理章程、治理组织、通用操作指引及流程规范等基础信息
393
27
MateChatMateChat
前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。 官网地址:https://matechat.gitcode.com
1.2 K
133