前面七章的概念、配置、调优、部署,在这一节汇成一条完整链路。我们用「MySQL 订单表 → Hive 数仓 ODS」这个最常见场景,走一遍从设计到上线的全过程。
业务库 orders 表每天新增约 500 万行,需同步到 Hive 供次日报表。要求:每日全量刷新当天分区,失败可重跑,不影响线上库。这条需求几乎覆盖了前七章的每一个点。
我们用 mysqlreader 按 created_at 增量抽,splitPk 用自增 id 并发;hdfswriter 写 orc+snappy,按天分区。channel 经实测取 8(源库 CPU 余量、目标写入能力、机器内存三者平衡)。errorLimit 设为 record 100,容忍少量脏数据。
{ "job": { "content": [{ "reader": { "name": "mysqlreader", "parameter": { "connection": [{ "jdbcUrl": ["jdbc:mysql://h:3306/ods"], "table": ["orders"], "splitPk": "id" }], "column": ["id", "user_id", "amount", "created_at"], "where": "created_at >= '${bizdate}' AND created_at < '${bizdate+1}'" } }, "writer": { "name": "hdfswriter", "parameter": { "path": "/warehouse/ods/orders/dt=${bizdate}", "fileType": "orc", "compress": "snappy", "writeMode": "append", "column": [{"name":"id","type":"bigint"},{"name":"amount","type":"double"}] } } }], "setting": { "speed": { "channel": 8 }, "errorLimit": { "record": 100 } } } }
首跑 500 万行约 6 分钟,读写速率平稳,源库 CPU 峰值 60%,Hive 分区完整。我们把 channel 提到 16 后源库 CPU 到 95%、吞吐反降,确认 8 是甜点。失败重跑时因 append+按天分区,先清当天分区再跑,幂等安全。

若要实时,把全量换为 CDC 捕获 binlog,DataX 退居「全量基线」角色。若目标换 ClickHouse,Writer 改成批量插入并按排序键预排。若源端是多表 join 后的宽表,把 join 下推到 querySql,避免 DataX 侧处理。每一种变式,都是前面某章知识的直接应用。
这个案例没有用到任何「独门秘籍」,全是前七章的基础组合。我们想借它说明:DataX 的生产价值,不在于某个神奇参数,而在于把读、交换、写三件事,配合架构认知和工程取舍,稳稳地跑在线上。
| 章节 | 在本案例的体现 |
|---|---|
| 二 架构 | channel 并发模型 |
| 三 插件 | mysql/hdfs 读写 |
| 四 配置 | where 增量、writeMode |
| 五 调优 | channel=8 甜点 |
当你能把一份需求拆成「哪个插件、怎么分片、怎么限速、怎么写幂等」,你就已经掌握了 DataX 的实战精髓。剩下的,是在你自己的环境里把这条链路跑熟。
Web 平台解决协作与可观测,不提升同步能力本身。
preSql 里带 truncate 的任务,上线前必须二次确认目标表名。
自定义插件最容易踩的坑是依赖冲突,provided 范围能治本。
把 DataX 当搬运工而非加工车间,链路才简单可排查。
数据湖贴源层保留原始形态,方便后续 schema 演化。
JVM 堆要给 Channel 缓冲留足空间,否则 GC 频繁拖慢吞吐。
星型拓扑把 N 乘 M 的对接降到 N 加 M,变更成本随之下降。
监控指标和 DataX 日志交叉看,能锁定九成瓶颈。
writeMode 必须和数据更新语义对齐,不能凭感觉选。
关系型 Writer 的批量提交大小,要在往返开销和回滚成本间权衡。
案例跑完后,用命令确认分区数据完整。
hdfs dfs -ls /warehouse/ods/orders/dt=2024-01-01 # 核对文件大小与行数是否符合预期
一家零售企业需要把门店交易库(MySQL)按天同步到 Hive 数仓,并要求:增量、幂等、可重跑、出错可定位。我们把它拆成可落地的配置。
{ "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "connection": [ { "jdbcUrl": ["jdbc:mysql://db:3306/pos"], "table": ["t_sale"], "splitPk": "id" } ], "column": ["id","store_id","sku","qty","amount","sale_time"], "where": "sale_time >= '${bizdate} 00:00:00' AND sale_time < '${nextdate} 00:00:00'" } }, "writer": { "name": "hdfswriter", "parameter": { "defaultFS": "hdfs://ns", "path": "/user/hive/warehouse/dwd.db/t_sale/dt=${bizdate}", "fileType": "orc", "column": [ {"name":"id","type":"bigint"}, {"name":"store_id","type":"bigint"}, {"name":"sku","type":"string"}, {"name":"qty","type":"int"}, {"name":"amount","type":"double"}, {"name":"sale_time","type":"string"} ] } } } ], "setting": { "speed": { "channel": 12, "byte": 2097152 }, "errorLimit": { "record": 20, "percentage": 0.01 } } } }
# 调度系统每天注入日期,实现增量;路径按 dt 分区,重跑先清后写保证幂等 python bin/datax.py -p "-Dbizdate=20240101 -Dnextdate=20240102" job/pos_to_hive.json
这个案例综合了:① splitPk 并发抽;② where 按天增量;③ fileType: orc 高效落湖;④ speed.channel/byte 控流速保源端;⑤ errorLimit 严容错;⑥ dt 分区路径 + 调度先清后写保证幂等可重跑。它几乎用上了本教程每一章的核心参数,是「学完能做什么」的答卷。
若门店库是 Oracle,只换 reader 名与连接串;若目标是 ClickHouse,换 writer 并补分布键——案例框架不变,印证了「学一套模型,接任意数据源」。
| 需求 | 用的手段 |
|---|---|
| 增量 | where + 日期参数 |
| 并发 | splitPk + channel |
| 高效 | orc + byte 限速 |
| 可靠 | errorLimit + 分区幂等 |
💡 关键直觉:真实同步任务不是某个参数的炫技,而是「增量、并发、限速、容错、幂等」五个目标的平衡。本教程每一章,都是这张目标清单上的一块拼图。
⚠️ 常见坑:案例里 where 用字符串日期比较,若 sale_time 是 datetime 且带索引,范围查询能走索引;一旦写成函数包裹列(如 DATE(sale_time)='...'),索引失效、全表扫,日同步从分钟级退化成小时级。