dolphinschedule使用shell任务结束状态研究
创始人
2024-05-30 15:53:05
0

背景:配置的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博客

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

    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/1400413String commandFilePath = buildCommandFilePath();//把你在dolphin框框填的command 封装好// create command file if not existscreateCommandFileIfNotExists(execCommand, commandFilePath);//创建一个process 准备去执行//build processbuildProcess(commandFilePath);//打印输出的内容 其实也就是你在dolphin看到的日志// parse process outputparseProcessOutput(process);//获取processidInteger processId = getProcessId(process);result.setProcessId(processId);// cache processIdtaskExecutionContext.setProcessId(processId);taskExecutionContextCacheManager.cacheTaskExecutionContext(taskExecutionContext);// print process idlogger.info("process start, process id is: {}", processId);// if timeout occurs, exit directlylong remainTime = getRemaintime();//注意这里啊  这里还假装看了下status 其实这个一直为true。// waiting for the run to finishboolean status = process.waitFor(remainTime, TimeUnit.SECONDS);logger.info("process has exited, execute path:{}, processId:{} ,exitStatusCode:{}",taskExecutionContext.getExecutePath(),processId, result.getExitStatusCode());// if SHELL task exit  //这里一直为trueif (status) {// set appIdsList appIds = getAppIds(taskExecutionContext.getLogPath());result.setAppIds(String.join(Constants.COMMA, appIds));// SHELL task stateresult.setExitStatusCode(process.exitValue());// if yarn task , yarn state is final stateif (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 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去看任务是否失败
            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.shbash /data/DATA_DIR/share/dw_kpi/shell/cc_with_set.sh 
bash /data/DATA_DIR/share/dw_kpi/shell/cc.sh
成功
no_set_cc.shbash /data/DATA_DIR/share/dw_kpi/shell/cc_no_set.sh 
bash /data/DATA_DIR/share/dw_kpi/shell/cc.sh
成功
with_set.shbash /data/DATA_DIR/share/dw_kpi/shell/cc_with_set.sh 
 
失败
no_set.shbash /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的任务状态是由什么决定的? 艹 

相关内容

热门资讯

中国—乌兹别克斯坦职业教育合作... 中国教育报-中国教育新闻网讯(记者 杨国良)近日,由重庆工程职业技术学院主办的中国—乌兹别克斯坦职业...
飞天诚信:董事、副总经理计划减... 格隆汇6月16日|飞天诚信(300386.SZ)公告称,公司持股11.26%的股东、董事、副总经理李...
甘肃能源:民勤100万千瓦风光... 本报讯 (记者刘欢)6月16日晚间,甘肃电投能源发展股份有限公司发布公告称,近日,公司收到甘肃电投民...
中电鑫龙:董事计划减持不超过6... 每经AI快讯,6月16日,中电鑫龙(002298.SZ)公告称,公司董事束龙胜因个人资金需求,计划在...
以色列总理威胁德黑兰市民“立即... 转自:CCTV国际时讯以色列总理内塔尼亚胡今天(6月16日)发表声明称,以色列空军已掌控德黑兰领空,...
山河药辅:复星医药减持计划实施... 2025年2月24日,安徽山河药用辅料股份有限公司(以下简称“山河药辅”)发布《关于5%以上股东减持...
IPO鹰眼预警|新恒汇上市触发... Hehson财经上市公司研究院|财报鹰眼预警新恒汇电子股份有限公司(以下简称“新恒汇”)拟计划在深圳...
“银联会议”App骗局:一通来...   “接了个会议电话,手机银行App里面的存款就被诈骗分子转走了。”近日,家住北京的受害者常燕(化名...
A股三指齐升!成份股狂掀涨停潮...   A股三大指数今日(6月16日)集体收涨,截至收盘,沪指涨0.35%,深证成指涨0.41%,创业板...
医院 “健身房”走红 个性化“... 6月16日,在四川省骨科医院运动医学科的治疗室内,康复师正依据个性化“运动处方”指导患者训练。这里既...
歼-10CE,到巴黎了 当地时间6月16日,第55届巴黎-布尔歇国际航空航天展览会(以下简称“巴黎航展”)在法国巴黎正式拉开...
一中支领“百万罚单”,紫金保险... 转自:北京商报保险业再现大额罚单。6月16日,北京商报记者了解到,紫金财产保险股份有限公司洛阳中心支...
【环球财经】新加坡海峡时报指数... 转自:新华财经新华财经新加坡6月16日电(记者刘春涛)新加坡海峡时报指数16日跌0.08%,收于39...
MS CONCEPT(0844... MS CONCEPT(08447)发布公告,公司全资附属公司Lord Restaurant(作为租户...
力合科技股东国科瑞华拟减持55... 力合科技(湖南)股份有限公司于近日发布了关于股东减持股份的预披露公告。公告显示,股东国科瑞华创业投资...
新华时评·民生无小事|严肃整治... 转自:新华社新华社南宁6月16日电  题:严肃整治学生用品采购环节乱象新华社记者陈一帆以方便教学为名...
“中国正考虑解除对英国议员制裁... 中国外交部发言人郭嘉昆16日主持例行记者会。有记者提问:据英国《卫报》报道,两名英国政府消息人士透露...
黄石博仕肛肠医院过度医疗追踪:... 125份抽查病例中,113份存在过度医疗行为;就诊患者手术率超90%,远超当地平均水平……翻开卫健部...
能源和科技巨头齐聚华盛顿 讨论... 格隆汇6月16日|据AXIOS网站,今天,来自石油巨头、科技和电力巨头以及金融巨头的高管们将在华盛顿...
隆平高科第一期员工持股计划第三... 6月16日,隆平高科(000998)发布公告,关于长期服务计划之第一期员工持股计划的第三个锁定期于2...