Datax调度与数据传输流程

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 

你可能感兴趣的:(java,java)