Datax调度与数据传输流程
调度指的是 Datax
根据数据(任务执行情况)来进行任务执行的顺序以及优先级;数据传输是指 reader
和 writer
是如何配合进行数据之间的交互,以及 Datax
的一些特性例如速率把控、并行操作等是如何实现的。
1. 调度流程
调度流程的代码入口在 JobContainer.java
的 schedule()
方法。
首先会获取全局的channel
数、每个TaskGroup
的channel
数以及计算需要的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
使用了 TaskGroupContainerRunner
将 Configuration
封装成一个 TaskGroupContainer
,同时 TaskGroupContainerRunner
的 state
属性代表其 TaskGroupContainer
的状态。然后交给固定线程池去执行。
接下来是任务启动代码.
@Override
public void run() {
try {
Thread.currentThread().setName(
String.format("taskGroup-%d", this.taskGroupContainer.getTaskGroupId()));
this.taskGroupContainer.start();
this.state