DataX篇—分布式任务调度框架xxl-job学习

参考资料:

​ https://juejin.cn/post/6938034809197297694

前言

DataX-Web页面负责管理调度DataX插件,而DataX-web实现DataX插件调度的底层框架是分布式任务调度框架XXL-Job,参考了大佬的笔记,仅供学习用。

一、作业类型

xxl-job支持七种作业类型:

BeanGLUE(Java)GLUE(Shell)GLUE(Python)GLUE(PHP)GLUE(Nodejs)GLUE(PowerShell)

其中,GLUE类型作业都是在admin管理端编辑业务代码,而Bean类型作业是将用户业务代码逻辑集成到xxl-job进行调度,源码位于用户项目中,而非xxl-jobadmin模块

xxl-job抽象IJobHandler组件,用于执行作业,其实现有三种(见下图):

image-20210312090105033

MethodJobHandler : Bean类型作业处理器,Bean类型作业逻辑实际上封装在带有@XxlJob注解的Method中;

ScriptJobHandler:脚本类型作业处理器,如ShellPythonPHPNodejsPowerShell等都可以看出脚本类型作业,使用该处理器;

GlueJobHandler:该种作业处理器专门用于处理Glue(Java)类型作业,上节分析过Java类型作业会被GlueFactory编译、初始化成实例,然后封装到GlueJobHandler中进行执行。

二、执行流程

服务端流程

服务端作业执行触发入口见JobTriggerPoolHelper#addTrigger

public void addTrigger(final int jobId,
                       final TriggerTypeEnum triggerType,
                       final int failRetryCount,
                       final String executorShardingParam,
                       final String executorParam,
                       final String addressList) {
   

    // 这里根据一定规则将触发任务从两个线程池中选取一个进行投递
    // fastTriggerPool:默认投递线程池
    // slowTriggerPool:慢作业投递到该线程池
    // 慢作业定义:投递超过500ms,且累计一分钟超过10次(每分钟重置缓存重新计算),则该作业就是慢作业,后续执行时使用slowTriggerPool 
    ThreadPoolExecutor triggerPool_ = fastTriggerPool;
    AtomicInteger jobTimeoutCount = jobTimeoutCountMap.get(jobId);
    if (jobTimeoutCount!=null && jobTimeoutCount.get() > 10) {
         // job-timeout 10 times in 1 min
        triggerPool_ = slowTriggerPool;
    }

    // trigger
    triggerPool_.execute(new Runnable() {
   
        @Override
        public void run() {
   

            long start = System.currentTimeMillis();

            try {
   
                // 触发作业
                XxlJobTrigger.trigger(jobId, triggerType, failRetryCount, executorShardingParam, executorParam, addressList);
            } catch (Exception e) {
   
                logger.error(e.getMessage(), e);
            } finally {
   

                // 每分钟清空慢作业累计缓存
                long minTim_now = System.currentTimeMillis()/60000;
                if (minTim != minTim_now) {
   
                    minTim = minTim_now;
                    jobTimeoutCountMap.clear();
                }

                // 超过500ms则慢作业执行次数累计+1,
                // 执行端采用异步模式:作业下发到执行端放入到队列中即返回,所以,这个时间是不包括作业本身执行时间
                long cost = System.currentTimeMillis()-start;
                if (cost > 500) {
          // ob-timeout threshold 500ms
                    AtomicInteger timeoutCount = jobTimeoutCountMap.putIfAbsent(jobId, new AtomicInteger(1));
                    if (timeoutCount != null) {
   
                        timeoutCount.incrementAndGet();
                    }
                }
            }

        }
    });
}

继续向下跟踪XxlJobTrigger#trigger:

private static void processTrigger(XxlJobGroup group, XxlJobInfo jobInfo, int finalFailRetryCount, TriggerTypeEnum triggerType, int index, int total){
   

    // 阻塞处理策略
    ExecutorBlockStrategyEnum blockStrategy = ExecutorBlockStrategyEnum.match(jobInfo.getExecutorBlockStrategy(), ExecutorBlockStrategyEnum.SERIAL_EXECUTION);
    // 路由策略
    ExecutorRouteStrategyEnum executorRouteStrategyEnum = ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null);    // route strategy
    // 分片参数
    String shardingParam = (ExecutorRouteStrategyEnum.SHARDING_BROADCAST==executorRouteStrategyEnum)?String.valueOf(index).concat("/").concat(String.valueOf(total)):null;

    // 1、save log-id
    XxlJobLog jobLog = new XxlJobLog();
    jobLog.setJobGroup(jobInfo.getJobGroup());
    jobLog.setJobId(jobInfo.getId());
    jobLog.setTriggerTime(new Date());
    // xxl_job_log插入运行日志
    XxlJobAdminConfig.getAdminConfig().getXxlJobLogDao().save(jobLog);
    logger.debug(">>>>>>>>>>> xxl-job trigger start, jobId:{}", jobLog.getId());

    // 2、init trigger-param
    TriggerParam triggerParam = new TriggerParam();
    triggerParam.setJobId(jobInfo.getId());
    triggerParam.setExecutorHandler(jobInfo.getExecutorHandler());
    triggerParam.setExecutorParams(jobInfo.getExecutorParam());
    triggerParam.setExecutorBlockStrategy(jobInfo.getExecutorBlockStrategy());
    triggerParam.setExecutorTimeout(jobInfo.getExecutorTimeout());
    triggerParam.setLogId(jobLog.getId());
    triggerParam.setLogDateTime(jobLog.getTriggerTime().getTime());
    triggerParam.setGlueType(jobInfo.getGlueType());
    triggerParam.setGlueSource(jobInfo.getGlueSource());
    triggerParam.setGlueUpdatetime(jobInfo.getGlueUpdatetime().getTime());
    triggerParam.setBroadcastIndex(index);
    triggerParam.setBroadcastTotal(total);

    // 初始化执行器地址
    String address = null;
    ReturnT<String> routeAddressResult = null;
    if (group.getRegistryList()!=null && !group.getRegistryList().isEmpty()) 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
DataX任务调度方法是通过DataX-Web页面来管理和调度DataX插件。DataX-web实现了DataX插件调度的底层框架,该框架使用了分布式任务调度框架XXL-Job作为支持。XXL-Job是一个开源的分布式任务调度平台,用于管理和调度各种任务。 在DataX中,任务调度的过程涉及到两个主要的接口:IJobHandler和DataXJob。IJobHandler是封装了任务调度逻辑的接口,而DataXJob是根据任务的切分和并发设置进行任务分配和调度的决策逻辑。 举例来说,当用户提交一个DataX作业时,DataX会根据作业的配置和要求将任务切分成若干个Task,并根据设置的并发数将Task分配给对应的TaskGroup。每个TaskGroup负责并行运行一定数量的Task,以实现任务的高效处理和并行执行。 综上所述,DataX任务调度方法是通过DataX-Web页面管理和调度DataX插件,底层使用XXL-Job作为分布式任务调度框架任务调度的决策逻辑是根据任务的切分和并发设置进行任务分配和调度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [DataX分布式任务调度框架xxl-job学习](https://blog.csdn.net/qq_33451695/article/details/115093108)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [datax源码解析-任务调度机制解析](https://blog.csdn.net/pony_maggie/article/details/122017233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值