深入解析Apache DolphinScheduler容错机制

简述

Apache Dolphinscheduler Master和Worker都是支持多节点部署,无中心化的设计。

  • Master主要负责是流程DAG的切分,最终通过RPC将任务分发到Worker节点上以及Worker上任务状态的处理
  • Worker主要负责是真正任务的执行,最后将任务状态汇报给Master,Master进行状态处理

那问题来了:

  1. Master掉了怎么办?它是负责流程实例的管理的。这样Worker就没有办法给它汇报任务状态,当然它也不能做状态处理了?
  2. Worker掉了又怎么办?要知道Worker是真正任务执行的载体,它如果掉了。Master要怎么处理?

来来来,一张图说清楚它们。

容错

总结

其实说白了就是如果Master掉了,其他Master分布式锁来对Master进行容错。也就是流程实例由之前的down掉的Master切换到要接管的Master上,这个时候是需要给Worker下发新Master的host的,让Worker可以重新给新Master上报信息

而Worker掉了就是任务的重试,但是任务重试之前是有前提的,那就是要kill掉正在运行YARN上的任务,当前DS做不到。为什么?因为对于在非客户端分离模式下,是需要ProcessBuilder的waitFor一直等待客户端进程退出的。而applicationId的解析是在客户端进程退出(也就是waitFor退出)之后做的。

那意思就是说只能等待程序运行完毕,我才能获取到applicationId。

org.apache.dolphinscheduler.server.master.service.WorkerFailoverService#killYarnTask

复制代码
private void killYarnTask(TaskInstance taskInstance, ProcessInstance processInstance) {
    try {
        if (!masterConfig.isKillApplicationWhenTaskFailover()) {
            return;
        }
        if (StringUtils.isEmpty(taskInstance.getHost()) || StringUtils.isEmpty(taskInstance.getLogPath())) {
            return;
        }
        TaskExecutionContext taskExecutionContext = TaskExecutionContextBuilder.get()
                .buildWorkflowInstanceHost(masterConfig.getMasterAddress())
                .buildTaskInstanceRelatedInfo(taskInstance)
                .buildProcessInstanceRelatedInfo(processInstance)
                .buildProcessDefinitionRelatedInfo(processInstance.getProcessDefinition())
                .create();
        // only kill yarn/k8s job if exists , the local thread has exited
        log.info("TaskInstance failover begin kill the task related yarn or k8s job");
        ILogService iLogService =
                SingletonJdkDynamicRpcClientProxyFactory.getProxyClient(taskInstance.getHost(), ILogService.class);
        GetAppIdResponse getAppIdResponse =
                iLogService.getAppId(new GetAppIdRequest(taskInstance.getId(), taskInstance.getLogPath()));
        ProcessUtils.killApplication(getAppIdResponse.getAppIds(), taskExecutionContext);
    } catch (Exception ex) {
        log.error("Kill yarn task error", ex);
    }
}

怎么办?回顾 1.3.3 版本,是LoggerServer和Master是分离模式的,所以只要Master节点有yarn客户端,是可以通过master对yarn上的applicationId进行干掉的。而现在怎么办?

两种解决思路 :

  1. Master上kill,使用yarn rest api

    复制代码
    curl -X PUT -d '{"state":"KILLED"}' \
     -H "Content-Type: application/json" \
     http://xx.xx.xx.xx:8088/ws/v1/cluster/apps/application_1694766249884_1098/state?user.name=hdfs

    注意 : 需要加用户。

  2. Worker上kill

这个是需要标识该任务是容错任务 ,然后在任务重试运行的时候,调度到指定的Worker上。需要先kill当前运行的applicationId,然后再任务重试。其实这里有一个优化点就是,是Worker掉了,但是任务还在,所以需要判断的是yarn上的状态,如果异常,再kill也不迟,而不是上来就kill。如果是RUNNING,等待就好,可以设置等待超时时间。

转载自journey

原文链接:https://segmentfault.com/a/1190000045084857

本文由 白鲸开源科技 提供发布支持!

相关推荐
B站计算机毕业设计之家4 分钟前
大数据项目:基于python电商平台用户行为数据分析可视化系统 电商订单数据分析 Django框架 Echarts可视化 大数据技术(建议收藏)
大数据·python·机器学习·数据分析·django·电商·用户分析
测试人社区—667915 分钟前
GPT-4开启“软件工程3.0“新时代:测试工程师的智能化转型指南
大数据
数据猿19 分钟前
【“致敬十年”系列】专访中国商联数据委会长邹东生:以“最小化场景闭环”实现AI真价值
大数据·人工智能
web3.088899922 分钟前
唯品会商品详情 API 数据解析
大数据
B站计算机毕业设计之家32 分钟前
大数据:基于python唯品会商品数据可视化分析系统 Flask框架 requests爬虫 Echarts可视化 数据清洗 大数据技术(源码+文档)✅
大数据·爬虫·python·信息可视化·spark·flask·唯品会
沧海寄馀生32 分钟前
Apache Hadoop生态组件部署分享-Spark
大数据·hadoop·分布式·spark·apache
专注数据的痴汉34 分钟前
「数据获取」中华人民共和国乡镇行政区划简册(2010-2017)(2011-2012缺失)
大数据·人工智能·信息可视化
专注数据的痴汉40 分钟前
「数据获取」中国河流水系 2000 至 2022 年变化矢量数据集
大数据·人工智能·信息可视化
数据皮皮侠44 分钟前
中国气候政策不确定性数据(2000-2022)
大数据·数据库·人工智能·信息可视化·微信开放平台
寒季6661 小时前
Flutter 智慧零售服务平台:跨端协同打造全渠道消费生态
大数据·人工智能