Datax调度与数据传输流程

本文详细介绍了Datax的调度流程,从调度代码入口到任务执行,以及数据传输流程,包括初始化、读写任务的具体实现和Exchanger交互。Datax采用生产者-消费者模型,通过Exchanger进行数据交互,实现高效并行和速率控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Datax调度与数据传输流程

调度指的是 Datax 根据数据(任务执行情况)来进行任务执行的顺序以及优先级;数据传输是指 readerwriter 是如何配合进行数据之间的交互,以及 Datax 的一些特性例如速率把控、并行操作等是如何实现的。

1. 调度流程

调度流程的代码入口在 JobContainer.javaschedule() 方法。

首先会获取全局的channel数、每个TaskGroupchannel数以及计算需要的channelNumber个数

    int channelsPerTaskGroup = this.configuration.getInt(
            CoreConstant.DATAX_CORE_CONTAINER_TASKGROUP_CHANNEL, 5);
    int taskNumber = this.configuration.getList(
            CoreConstant.DATAX_JOB_CONTENT).size();

    this.needChannelNumber = Math.min(this.needChannelNumber, taskNumber);

接着调用 JobAssignUtil 对每个 TaskGroup 进行 channel的轮询 式分配。

    List<Configuration> taskGroupConfigs = JobAssignUtil.assignFairly(this.configuration,
            this.needChannelNumber, channelsPerTaskGroup); 

然后实例化AbstractScheduler 进行调度。

    private void schedule() {
    
        //...
        scheduler.schedule(taskGroupConfigs);
        //...
    }

Scheduler主要完成两个事情:

  • 监控流程信息
  • 启动所有任务
    int totalTasks = calculateTaskCount(configurations);  //计算任务总数
    startAllTaskGroup(configurations);      //开启所有任务

这里的startAllTaskGroup调用的是AbstractScheduler 的接口ProcessInnerScheduler#startAllTaskGroup方法

    public void startAllTaskGroup(List<Configuration> configurations) {
   
        this.taskGroupContainerExecutorService = Executors
                .newFixedThreadPool(configurations.size());

        for (Configuration taskGroupConfiguration : configurations) {
   
            TaskGroupContainerRunner taskGroupContainerRunner = newTaskGroupContainerRunner(taskGroupConfiguration);        //实例化 TaskGroupContainerRunner -> TaskGroupContaine
            this.taskGroupContainerExecutorService.execute(taskGroupContainerRunner);
        }

        this.taskGroupContainerExecutorService.shutdown();
    }

可以看出Datax 使用了 TaskGroupContainerRunnerConfiguration 封装成一个 TaskGroupContainer,同时 TaskGroupContainerRunnerstate 属性代表其 TaskGroupContainer 的状态。然后交给固定线程池去执行。

接下来是任务启动代码.

	@Override
	public void run() {
   
		try {
   
            Thread.currentThread().setName(
                    String.format("taskGroup-%d", this.taskGroupContainer.getTaskGroupId()));
            this.taskGroupContainer.start();
			this.state 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值