alibaba / DataX

DataX是阿里云DataWorks数据集成的开源版本。
Other
15.89k stars 5.42k forks source link

并发数,writer/reader/channel到底啥关系 #1533

Closed EndlessDistance closed 2 years ago

EndlessDistance commented 2 years ago
job: datahub-to-mysqlrulewriter.json
 "setting": {
      "speed": {
        "channel": 16
      },

我发现无论job配置中的channel数设置多少,实际启动的writer数和reader数都不改变,而这个数量是和datahub的shard数一致的。core.json和全局job设置都是默认。我看top命令里还启动了好几个线程池,请问线程池、reader/writer、channel这三者到底是啥关系?我该怎么修改才能使任务并发速度达到最佳?

dingxiaobo commented 2 years ago

channel 是用户配置的并发数,

具体channel的原理可以看这里:com.alibaba.datax.core.job.JobContainer#schedule

在 datahub 读任务中,真实运行的并发数为min(shard数, channel配置值),一般channel数量与shard数据量相等性能最佳。

EndlessDistance commented 2 years ago

channel 是用户配置的并发数,

具体channel的原理可以看这里:com.alibaba.datax.core.job.JobContainer#schedule

在 datahub 读任务中,真实运行的并发数为min(shard数, channel配置值),一般channel数量与shard数据量相等性能最佳。

还有一个问题,今天同步odps到mysql的时候发现实际并发数固定为2,odps好像也没有调类似shard的设置,我该如何提高并发数?在不同数据源同步任务中,我该怎么判断datax根据什么配置起几个reader和writer线程?

dingxiaobo commented 2 years ago

odps读取的时候,每个task负责不同的 [ startIndex, startIndex + count ] 数据区间。

一般根据源端切分方式来确定怎么配并发,切分方式可以看 Reader.Job中的 split 方法是怎么实现的,

举个例子,

消息类根据shard数、partition数来写并发数,

DB类、数仓类可以根据自己的源库负载来写并发数。

EndlessDistance commented 2 years ago

odps读取的时候,每个task负责不同的 [ startIndex, startIndex + count ] 数据区间。

一般根据源端切分方式来确定怎么配并发,切分方式可以看 Reader.Job中的 split 方法是怎么实现的,

举个例子,

消息类根据shard数、partition数来写并发数,

DB类、数仓类可以根据自己的源库负载来写并发数。

多谢,odps我看了可以通过配置分区提高并发,但是这个得在执行前手动去写配置文件。我看reader连接odps的时候已经读取到多级分区信息了,建议将配置文件中给定的分区自动根据读取到的分区信息分割成多个子分区,以提高并发。

["ds='20221010',*,*"],

["ds='20221010',hh='14',mm='15'",
  "ds='20221011',hh='10',mm='45'",
  "ds='20221011',hh='11',mm='00'",
  "ds='20221011',hh='11',mm='45'",
  "ds='20221011',hh='14',mm='00'",
  "ds='20221011',hh='14',mm='15'"
],