setting 块决定任务怎么被调度、容错到什么程度。这里几个参数直接对应第二章的并发模型,值得逐个字抠。
speed.channel 是并发通道数,决定同时跑几个 Task。speed.byte 是每秒字节限速,防止把网络或磁盘打满。speed.record 是每秒记录数限速。三者关系:channel 控并发度,byte/record 控单任务流速。我们一般先定 channel,再按集群闲忙设 byte 上限。
{ "job": { "setting": { "speed": { "channel": 8, "byte": 1048576 }, "errorLimit": { "record": 100, "percentage": 0.05 } } } }
errorLimit.record 是允许多少条脏数据(类型转换失败、主键冲突等)后任务失败;percentage 是允许的比例。设成 0 表示一条都不容忍,任何脏数据都让任务挂掉。我们按数据质量需求定:核心账目用 0,日志类宽松些。

把 channel 调很大,吞吐未必线性上升。因为每个 Channel 都占内存做缓冲,channel 多了堆内存吃紧,反而触发 GC 停顿甚至 OOM。所以 speed 不是越大越好,而要和目标端写入能力、机器内存一起算。第五章会给出估算方法。
生产环境我们默认 channel 取 min(核数的一半, 源端能承受的连接数),byte 限速设为集群可用带宽的七成。这个基线不是金科玉律,但能避免「一上线就把共享集群冲垮」的事故。
speed.channel 调大,吞吐往往先升后平再降。升是因为并发起来了;平是因为目标端或源端到顶;降是因为每个 channel 占内存,太多导致 GC 甚至 OOM。所以 channel 要和目标端写入能力、机器内存一起算,而非孤立拍。
| channel | 典型结果 |
|---|---|
| 偏小 | 资源没用满,慢 |
| 合适 | 吞吐最高 |
| 偏大 | 内存涨、反降 |
我们一般先取「机器核数一半」和「源端可承受连接数」的较小值作为起点,再实测找拐点。这一节的全局参数,正是第五章调优的旋钮入口。
DataX 的设计哲学是把连接差异收敛到插件,让核心只管调度与缓冲。
插件目录名必须和 job.json 的 name 完全一致,大小写都不能错。
机器核数、内存、带宽三者共同决定 channel 的甜点值。
退出码接进调度系统,才能让失败在半夜被及时发现。
eswriter 的批量 bulk 写入,比逐条插入快一个数量级。
源库索引评审应作为同步查询上线的前置环节。
splitPk 的列若分布不均,分片会倾斜,部分 Task 拖慢整体。
writeMode 必须和数据更新语义对齐,不能凭感觉选。
调优的本质是在 CPU、网络带宽和磁盘 IO 之间找平衡点,不是堆资源。
自定义插件最容易踩的坑是依赖冲突,provided 范围能治本。
对象存储比 FTP 更适合做跨机房中转,因为它支持断点和内网加速。
任务的读写速率差,比绝对速率更能说明瓶颈在哪一段。
反压机制保护内存,看到任务变慢应去优化下游而非加并发。
一张参数与吞吐的经验曲线,比任何通用公式都贴近你的环境。
星型拓扑把 N 乘 M 的对接降到 N 加 M,变更成本随之下降。
任务可重跑幂等,是生产上线前的硬指标。
配置进版本库、密码进环境变量,是跨环境复用的基础。
Reader 和 Writer 互不知晓,正是插件能独立扩展的原因。
querySql 与 column 二选一,混用会直接报错。
脏数据阈值设得太高,会掩盖源端的数据质量问题,反而埋雷。
数据湖贴源层保留原始形态,方便后续 schema 演化。
多租户隔离交给编排层,DataX 保持简单最稳妥。
把 DataX 当搬运工而非加工车间,链路才简单可排查。
全量基线加增量补充,是批流配合的常见稳妥组合。
rowkey 的散列前缀设计,能避免 HBase 写入热点。
测试样本先小后大,几分钟校验能省下几小时排错。
限速不是限制能力,而是给其他任务留出生存空间。
把转换逻辑下推到源库,通常比在 DataX 内部处理更高效。
Web 平台解决协作与可观测,不提升同步能力本身。
限速参数常和并发一起调,下面是常见的组合。
{ "setting": { "speed": { "channel": 8, "byte": 5242880, "record": 20000 } } }
setting 里的 speed 与 errorLimit 是任务的两只「刹车与油门」。调得好,源端稳、跑得快;调不好,要么压垮源端,要么脏数据悄悄丢。
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "connection": [ { "jdbcUrl": ["jdbc:mysql://db:3306/big"], "table": ["t_big"], "splitPk": "id" } ], "column": ["id","v"] } }, "writer": { "name": "hdfswriter", "parameter": { "defaultFS": "hdfs://ns", "path": "/data/big", "fileType": "text", "column": [ {"name":"id","type":"bigint"}, {"name":"v","type":"string"} ] } } } ], "setting": { "speed": { "channel": 12, "byte": 2097152 }, "errorLimit": { "record": 50, "percentage": 0.05 } } } }
# 4.2 全局配置参数详解(speed, errorLimit, channel等) python bin/datax.py job/big_to_hdfs.json 2>&1 | grep -E "Speed|dirty"
speed.channel:并发水管数,决定最多同时跑几个 Task;speed.byte:每通道字节限速,是比 channel 更平滑的节流阀;errorLimit.record:脏数据条数上限;errorLimit.percentage:脏数据比例上限,二者任一超阈即整任务失败。两者组合能表达「最多容忍 50 条或 5%,否则报警」,比单一阈值更贴合业务。
对金融对账类任务,把 errorLimit 设为 {record:0},零容忍;对日志类任务可放宽到数千条,优先保吞吐。
| 参数 | 语义 | 调大 / 调小 |
|---|---|---|
| channel | 并发数 | 大=快但吃内存 |
| byte | 流限速 | 大=压源端 |
| errorLimit.record | 脏数上限 | 小=更严 |
| errorLimit.percentage | 脏比上限 | 小=更严 |
💡 关键直觉:speed 是油门、errorLimit 是安全带。生产里先系好安全带(严容错),再慢慢踩油门(加 channel/byte),而不是反过来。
⚠️ 常见坑:只设 channel 不设 byte,源端在并发高峰被瞬时抽空;或把 errorLimit 设 0 又遇到极少量源端脏字符,导致整任务反复失败——零容忍要有数据质量前置清洗兜底。