dolphinschedule使用shell任务结束状态研究

2023-11-17

背景:配置的dolphin任务,使用的是shell,shell里包含了spark-submit 如下截图。 

dolphin

 shell

 介绍完毕,开始说明现象。 有天有人调整了集群的cdp配置,executor-cores max=1

我之前这里写的是2,所以spark任务就报错了  spark-submit报错_cclovezbf的博客-CSDN博客

不多说,后面改下这个配置就好了,spark任务就能运行起来。

但是在这个过程中发现了一个很严重很严重的问题。 这个任务失败了,报错了,但是dolphin显示状态居然是成功!!!!!!!!!!!!!!!!!!!

报错1 列数不对 还有资源不够,还有我里面涉及的接口网络超时,都是我自己故意模拟的的

 很明显这里报错了,那么这个dolphin任务就该是失败状态呀。怎么回事??

直接百度!!!

海豚调度任务如何判断任务成功还是失败(源码)?_海豚调度器3.0api访问hive失败_黑眼圈@~@的博客-CSDN博客

 其实我都没怎么看这篇文章,但是还是提示我要去看源码。

AbstractCommandExecutor.java

    public CommandExecuteResult run(String execCommand) throws Exception{

        CommandExecuteResult result = new CommandExecuteResult();


        if (StringUtils.isEmpty(execCommand)) {
            return result;
        }
        //构建工作环境 dolphin 默认的是/tmp/dolphinscheduler/exec/process/588/2877/1284345/1400413
        String commandFilePath = buildCommandFilePath();
        
        //把你在dolphin框框填的command 封装好
        // create command file if not exists
        createCommandFileIfNotExists(execCommand, commandFilePath);
        //创建一个process 准备去执行
        //build process
        buildProcess(commandFilePath);
        //打印输出的内容 其实也就是你在dolphin看到的日志
        // parse process output
        parseProcessOutput(process);

        //获取processid
        Integer processId = getProcessId(process);

        result.setProcessId(processId);

        // cache processId
        taskExecutionContext.setProcessId(processId);
        taskExecutionContextCacheManager.cacheTaskExecutionContext(taskExecutionContext);

        // print process id
        logger.info("process start, process id is: {}", processId);

        // if timeout occurs, exit directly
        long remainTime = getRemaintime();
        //注意这里啊  这里还假装看了下status 其实这个一直为true。
        // waiting for the run to finish
        boolean status = process.waitFor(remainTime, TimeUnit.SECONDS);


        logger.info("process has exited, execute path:{}, processId:{} ,exitStatusCode:{}",
                taskExecutionContext.getExecutePath(),
                processId
                , result.getExitStatusCode());

        // if SHELL task exit  //这里一直为true
        if (status) {
            // set appIds
            List<String> appIds = getAppIds(taskExecutionContext.getLogPath());
            result.setAppIds(String.join(Constants.COMMA, appIds));

            // SHELL task state
            result.setExitStatusCode(process.exitValue());

            // if yarn task , yarn state is final state
            if (process.exitValue() == 0){
                result.setExitStatusCode(isSuccessOfYarnState(appIds) ? EXIT_CODE_SUCCESS : EXIT_CODE_FAILURE);
            }
        } else {
            logger.error("process has failure , exitStatusCode : {} , ready to kill ...", result.getExitStatusCode());
            ProcessUtils.kill(taskExecutionContext);
            result.setExitStatusCode(EXIT_CODE_FAILURE);
        }


        return result;
    }

        if (status) { //这里一直为true 
            // set appIds  //获取application_id ,这里也吊的很,他是根据正则:application_ 去在打印输出的日志里 查这个application_id  我怀疑你echo 这个 他估计也要去查
            List<String> appIds = getAppIds(taskExecutionContext.getLogPath());
            result.setAppIds(String.join(Constants.COMMA, appIds));

            // SHELL task state 

// 这个exitValue比较重要,这个就是看shell最后退出的状态是什么?正常为0 其余都是失败
            result.setExitStatusCode(process.exitValue());

            // if yarn task , yarn state is final state

            //这里是说 shell正常退出了,执行成功了,我就去根据application_id去看任务是否失败  但是这里注意啊 我看了我们生产环境的common.properties没有配置rm的地址,他是怎么取请求rm的url 去获取yarn状态的呢? 所以这里我保留存疑,我看了日志根本就没有看到请求yarn获取状态。
            if (process.exitValue() == 0){ 
                result.setExitStatusCode(isSuccessOfYarnState(appIds) ? EXIT_CODE_SUCCESS : EXIT_CODE_FAILURE);
            }
        } 

这里我总结下dolphin判断任务的成功和失败。

shell 成功, 去看yarn是否失败, yarn任务成功 dolphin状态显示成功 否则就失败。

shell 失败, 那么dolphin就是失败。

看着很简单,但是这里又涉及到两个知识点

1.什么情况下shell叫成功呢?

其实上面说的不太对,

shell 成功= shell结束后的 exitCode=0

shell 失败= shell结束后的 exitCode!=0

 2.set -e 的作用

 简单的来说, 加了set -e 程序在遇到错误的时候就会停止,就是会抛异常。不加的话 程序会一直往下执行。

#set -e 
echo 1
ls/chenchi
echo 2

 好了介绍完毕,开始复现dolphin出现这个问题的原因。

cc_no_set.sh

#set -e

spark-submit error

cc_with_set.sh

set -e

spark-submit error

cc.sh

echo "success"

with_set_cc.sh bash /data/DATA_DIR/share/dw_kpi/shell/cc_with_set.sh 
bash /data/DATA_DIR/share/dw_kpi/shell/cc.sh
成功
no_set_cc.sh bash /data/DATA_DIR/share/dw_kpi/shell/cc_no_set.sh 
bash /data/DATA_DIR/share/dw_kpi/shell/cc.sh
成功
with_set.sh bash /data/DATA_DIR/share/dw_kpi/shell/cc_with_set.sh 
 
失败
no_set.sh bash /data/DATA_DIR/share/dw_kpi/shell/cc_no_set.sh 
 
失败

可以看到吧 这里为啥 我加了一个 bash cc.sh 就成功了?

因为dolphin 将两条命令 组装为一个shell

bash fail.sh

bash succes.sh

注意这里是没有加 set -e 的,说明程序执行了fail.sh后还是会继续执行succse.sh,这。。。。最后的结果肯定就是success。

真是他妈的一个大坑。 dolphin的任务状态是由什么决定的?

就是由你最后一条命令的状态决定的。

但是有的小伙伴又说了。 我有时候就是要两个任务搞到一起 ,

bash 1.sh

bash 2.sh

然后 我想 前面的1.sh失败了就不执行后面的2.sh了。 而不是像现在这样 1.sh失败 继续执行2.sh,

2.sh成功,最后dolphin的任务状态也成功。

很简单 你再加一句。

set -e 

bash 1.sh

bash 2.sh

这样即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dolphinschedule使用shell任务结束状态研究 的相关文章

  • 如何让 PHP、符号链接和 __FILE__ 很好地协同工作?

    在本地主机上 我有以下目录结构 share www trunk wp content plugins otherfolders share www portfolio wp content symlink Where symlink是一个符
  • 将用户添加到组但运行“id”时未反映

    R 创建了一个名为 Staff 的组 我希望能够在不以 sudo 身份启动 R 的情况下更新软件包 所以我使用以下方法将自己添加到员工中 sudo usermod G adm dialout cdrom plugdev lpadmin ad
  • 干净地销毁System V共享内存段

    我在用shmget shmat and shmctl分别获取和创建共享内存段 将其附加到进程地址空间中并删除它 我想知道进程是否仍然可以使用共享内存段 即使它已被分离并要求使用删除 shmctl id IPC RMID 在一个过程中 我无法
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 使用 linux perf 工具测量应用程序的 FLOP

    我想使用 perf Linux 性能计数器子系统的新命令行接口命令 来测量某些应用程序执行的浮点和算术运算的数量 出于测试目的 我使用了我创建的一个简单的虚拟应用程序 请参见下文 因为我找不到任何为测量 FP 和整数运算而定义的 perf
  • 访问 Linux 线程(pthreads)的本地堆栈

    我目前正在实现一个使用多线程但对总内存消耗有要求的应用程序 我希望有一个主线程执行 I O 并有几个工作线程执行计算 目前 我在主堆栈上有几个可供工作人员访问的数据结构 我使用 OpenMP 进行工作分配 由于主 工作者模式不能很好地与 O
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • sed 仅最后一个匹配模式

    我想sed仅文本文件的最后一个匹配模式 输入文件 boy boy girl boy 输出文件 boy boy girl boys 一种方法是反转文件 仅替换第一个匹配项 然后再次反转 tac
  • 如何使用 tmuxinator 在 tmux 中拆分水平窗格内的两个垂直窗格

    目前我的 tmuxinator yml 文件中有这个 windows editor layout main horizontal panes vim server rails s 这给了我两个窗口 一个用于编辑器 另一个用于服务器 在编辑器
  • 即使 makefile 和源代码存在,为什么“Build Project”在 Eclipse Helios CDT 中显示为灰色?

    我无法构建我的项目 我在 Eclipse Helios 中创建了一个新的 CDT 项目 并告诉它使用现有的源代码和 makefile 这两者都正确显示在 Package 和 Project 视图中 然而 项目 菜单中的 构建全部 和 构建项
  • 在64位操作系统上以32位模式和64位模式编译ioctl函数的执行有什么不同?

    我有 64 位 Enterprise SuSE 11 我有一个应用程序 它打开 HIDRAW 设备并在其上操作 ioctl 函数以从该设备获取原始信息 如下所示 struct hidraw devinfo devinfo int fd op
  • 在键盘热插拔上加载模块

    我正在尝试学习如何为 Linux 系统编写模块和驱动程序 类似于this https unix stackexchange com questions 120839 usb kernel module does not load on de
  • 有关 Linux 内存类型的问题

    关于Linux内存我有以下问题 我知道活动内存是最常访问的内存部分 但是有人可以解释一下 linux 如何考虑将内存位置用于活动内存或非活动内存 主动存储器由哪些部分组成 磁盘 文件缓存是否被视为活动内存的一部分 有什么区别Buffers
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 我在哪里可以学习如何使 C++ 程序与操作系统 (Linux) 交互

    我是一个 C 初学者 我想创建与操作系统交互的小程序 使用 Kubuntu Linux 到目前为止 我还没有找到任何教程或手册来让 C 与操作系统交互 在 PHP 中 我可以使用命令 exec 或反引号运算符来启动通常在控制台中执行的命令
  • 变量作为 bash 数组索引?

    bin bash set x array counter 0 array value 1 array 0 0 0 for number in array do array array counter array value array co
  • 是否有可能通过 mmap 匿名内存“打孔”?

    考虑一个使用大量大致页面大小的内存区域 例如 64 kB 左右 的程序 每个内存区域的寿命都相当短暂 在我的特定情况下 这些是绿色线程的替代堆栈 如何最好地分配这些区域 以便一旦该区域不再使用 它 们的页面可以返回到内核 天真的解决方案显然
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • 使用命令行将 MediaWiki 维基文本格式转换为 HTML

    我倾向于编写大量文档 因此 MediaWiki 格式对我来说很容易理解 而且比编写传统 HTML 节省了我很多时间 然而 我也写了一篇博客 发现一直从键盘切换到鼠标来输入正确的 HTML 标签会增加很多时间 我希望能够使用 Mediawik

随机推荐

  • java设计6大原则总结

    1 开闭原则 Open Close Principle 定义 一个软件实体如类 模块和函数应该对扩展开放 对修改关闭 开放 封闭原则的意思就是说 你设计的时候 时刻要考虑 尽量让这个类是足够好 写好了就不要去修改了 如果新需求来 我们增加一
  • 【亲测有效新手教程】Vscode连接远程服务器编辑并运行深度学习代码

    文章目录 前言 使用步骤 1 安装OpenSSH 2 安装Remote SSH 参考链接 前言 在服务器上通过桌面已经配置好了深度学习的环境 并且存放了相关代码以及数据集 之前使用向日葵连接服务器进行代码编写 使用下来发现有延迟 不够丝滑
  • Kotlin如何提供与Java的100%互操作性?

    Kotlin与Java可以100 互操作 当您在每篇博客文章 社区话题或YouTube上首次搜索有关Kotlin的信息时 如果该话题是关于Kotlin的 那么这个词肯定在每个人的名单上都表明Kotlin可与Java 100 互操作 让我们看
  • 几个值得研究的工具

    一 DLIB库 C 实现的机器学习算法库 有离线的人脸识别SDK 比openCV里的人脸识别库效果好 除了这个库 要找到合适的离线版本的人脸识别库很难 国内的阿里 腾讯 百度 都没有离线SDK 都是在线的 二 KEEL 工具 是一款开源的数
  • php使用smtp发送邮件(ssl链接方式)

    在这里我要介绍的是如何使用smtp进行发送邮件 分别介绍了普通链接和ssl链接两种方式 一 准备材料 smtp类下载地址 https download csdn net download panjiapengfly 10688054 二 代
  • 甲骨文发布适用于 MongoDB 的 Oracle Database API;Chrome 和 Edge 互相“拉踩”;树莓派驱动程序现可在 Android 上运行

    整理 宋彤彤 责编 屠敏 开源吞噬世界的趋势下 借助开源软件 基于开源协议 任何人都可以得到项目的源代码 加以学习 修改 甚至是重新分发 关注 开源日报 一文速览国内外今日的开源大事件吧 一分钟速览新闻点 倪光南 可适当聚焦 RISC V
  • C++随机数之default_random_engine

    头文件 include
  • kafka中partition数量与消费者对应关系

    kafka是由Apache软件基金会开发的一个开源流处理平台 kafka是一种高吞吐量的分布式发布订阅消息系统 它可以处理消费者在网站中的所有动作流数据 kafka中partition类似数据库中的分表数据 可以起到水平扩展数据的目的 比如
  • Extjs IE内存问题

    1 使用了ExtJS 3 1并且更改了模块加载方式之后 我的OPOA内存回收有所改进 记录一下概要 1 不用autoload url url scripts true 的方式 而使用eval response responseText 方式
  • 家乐氏董事会批准将于10月2日分拆为两家公司

    美通社消息 家乐氏公司宣布 其董事会正式批准之前宣布的分拆为两家独立上市公司 Kellanova 和 WK Kellogg Co 的计划 2023 年 10 月 2 日完成分拆后 家乐氏公司将更名为 Kellanova Kellanova
  • java笔记:接口的特征和使用

    接口 1 接口的定义 修饰符 interface 接口名 extends 父接口1 父接口2 零个到多个常亮定义 零个到多个抽象方法定义 零个到多个内部类 接口 枚举定义 零个到多个默认方法或类方法定义 修饰符可以为public或者省略 d
  • Java必备技能之环境搭建篇(基础环境)详细版

    本文都是 基于Window环境搭建 Java开发必备环境搭建 开发环境简图 基础版没有加入docker 本文重点在于基础环境 后期将在linux上 搭建基于容器化docker的开发部署环境 搭建思路 先单独搭建 最后集成搭建并配置 1 在w
  • 产品思维训练

    本周话题 现在P2P 平台新客户的拓展需要经过注册 绑卡 含实名认证 充值 交易几个步骤 从数据发现注册到绑卡这一步流失率很高 请分析一下原因 Bob 王 好多人记不住卡号 所以注册时不绑卡 一步步来可能流失率低些 另 注册一般就损失个人信
  • 安装live-server后启动时报错:bash: live-server: command not found

    live server详解 介绍以及安装 一 关于live server的介绍 live server插件实现了 修改文件浏览器自动刷新 浏览器自动打开项目 本地开发搭建临时的服务 二 关于live server的安装 1 安装node j
  • Qt第三十三章:阴影QGraphicsDropShadowEffect

    简单阴影 为QLabel QPushButton加阴影 class TestShadow QWidget def init self parent None super TestShadow self init parent self re
  • 关于在资源中的QML文件中访问本地Image文件(Qt的Bug)

    这里要讨论的内容是 将一个 QML 文件放置到 qrc 资源中后 需要访问本地目录的文件 比如图片的时候 遇到的一个在 Windows 和 Linux MeeGo 平台下表现不一致的 Bug 以及处理方法 事件起因 一个在资源文件中的 QM
  • CSS媒体查询@media and screen指令在部分(360、奇安信等)浏览器不生效的解决方案

    一 介绍出现问题的写法 media screen and width lt 1024px flex other display none 可以看到 乍一看没什么问题 而且在chrome edge等浏览器也生效 但是在360浏览器等其它浏览器
  • Weblogic反序列化漏洞(CVE-2018-2628/CVE-2023-21839复现)

    内容目录 Weblogic反序列化漏洞 CVE 2018 2628 CVE 2023 21839 weblogic中间件 CVE 2018 2628 漏洞描述 影响版本 漏洞复现 修复方案 CVE 2023 21839 漏洞描述 影响版本
  • 【SQL】1 SQL 教程

    本系列教程均来自菜鸟教程 SQL 教程 SQL 是用于访问和处理数据库的标准的计算机语言 在本教程中 您将学到如何使用 SQL 访问和处理数据系统中的数据 这类数据库包括 MySQL SQL Server Access Oracle Syb
  • dolphinschedule使用shell任务结束状态研究

    背景 配置的dolphin任务 使用的是shell shell里包含了spark submit 如下截图 dolphin shell 介绍完毕 开始说明现象 有天有人调整了集群的cdp配置 executor cores max 1 我之前这