DataX实战:从零部署到首个数据同步任务 1. 环境准备搭建DataX的基石第一次接触DataX时最让我头疼的就是环境配置。记得当时为了跑通第一个同步任务光是解决依赖问题就折腾了大半天。为了避免大家踩同样的坑我把关键要点都整理在这里。基础环境就像盖房子的地基没搭好后面全是问题。你需要准备三样东西JDK 1.8DataX核心是用Java开发的推荐用Oracle JDK现在应该叫Eclipse Temurin了。验证安装用java -version看到类似1.8.0_301的输出就对了Python环境虽然DataX内核是Java但启动脚本用的是Python。实测Python 2.7和3.6都能用个人推荐3.6避免编码问题Maven可选如果你要自己编译源码才需要直接下二进制包可以跳过这里有个新手容易忽略的点环境变量配置。去年帮一个同事排查问题发现他JDK装好了但JAVA_HOME没配导致DataX启动时报NoClassDefFoundError。正确的配置应该是# 以Linux为例加到~/.bashrc里 export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH提示Windows用户记得在系统环境变量里添加JAVA_HOME路径不要带中文或空格2. 安装DataX两种方式任你选2.1 直接下载二进制包推荐新手这是最快捷的方式适合想快速上手的同学wget https://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz tar -zxvf datax.tar.gz cd datax解压后的目录结构特别清晰bin/核心启动脚本datax.pyconf/日志配置等job/示例任务配置plugin/各种数据源的读写插件验证安装是否成功python bin/datax.py job/job.json如果看到类似任务启动时间、任务结束时间的日志最后显示任务执行成功说明安装没问题。2.2 源码编译安装适合定制需求去年做数据湖项目时我们需要修改HDFS插件的部分逻辑这时候就需要自己编译git clone https://github.com/alibaba/DataX.git cd DataX mvn -U clean package assembly:assembly -Dmaven.test.skiptrue编译完成后在target/datax/datax/下就是完整的安装包。这个过程可能会遇到两个常见问题Maven下载慢建议配置阿里云镜像内存不足编译需要至少2GB空闲内存虚拟机用户注意3. 第一个同步任务MySQL到MySQL现在来到实战环节我会带你完成一个真实的MySQL到MySQL同步。假设我们要把用户表从测试库同步到生产库。3.1 准备测试数据先在源库创建测试表CREATE TABLE user_source ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) DEFAULT NULL, email varchar(100) DEFAULT NULL, created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8; INSERT INTO user_source VALUES (1,张三,zhangsanexample.com,2023-01-01 10:00:00), (2,李四,lisiexample.com,2023-01-02 11:00:00);3.2 编写配置文件创建mysql2mysql.json这是我优化过的配置模板{ job: { setting: { speed: { channel: 3, byte: 1048576 }, errorLimit: { record: 10, percentage: 0.1 } }, content: [{ reader: { name: mysqlreader, parameter: { username: root, password: your_password, column: [id,name,email,created_at], splitPk: id, connection: [{ table: [user_source], jdbcUrl: [jdbc:mysql://127.0.0.1:3306/source_db] }] } }, writer: { name: mysqlwriter, parameter: { username: root, password: your_password, column: [id,name,email,created_at], writeMode: insert, connection: [{ jdbcUrl: jdbc:mysql://127.0.0.1:3306/target_db, table: [user_target] }] } } }] } }关键参数解析channel并发数根据服务器性能调整splitPk切分任务的字段必须有索引writeModeinsert/replace/updateerrorLimit设置容错阈值3.3 执行并验证启动任务python bin/datax.py path/to/mysql2mysql.json查看日志重点任务切分信息Split task[0] start...进度统计Percentage: 100.00%最终统计Total 2 records, 200 bytes验证数据SELECT * FROM target_db.user_target;应该能看到和源表完全一致的数据。4. 避坑指南常见问题解决方案在实际项目中我遇到过各种奇葩问题这里分享三个最典型的4.1 中文乱码问题现象同步后中文变成问号。解决方案确认MySQL的字符集是utf8mb4在jdbcUrl后添加参数jdbc:mysql://127.0.0.1:3306/db?useUnicodetruecharacterEncodingutf84.2 同步性能差上周优化过一个从Oracle到MySQL的同步原来要2小时调整后只要15分钟。关键优化点增加channel数建议从CPU核数的1/2开始合理设置batchSize比如5000-10000给splitPk字段加索引4.3 大字段处理同步TEXT/BLOB字段时容易OOM。应对方案在reader配置中添加jdbcFetchSize: 1000使用-Xmx2048m调大JVM内存考虑分批次同步5. 进阶技巧让同步更高效当你掌握了基础用法后这些技巧能让你事半功倍5.1 增量同步方案实际项目很少全量同步这里分享我的增量同步方案reader: { parameter: { where: update_time ${last_sync_time} } }配合调度系统把last_sync_time设为上次同步时间。5.2 数据转换DataX支持在同步时做简单转换transformer: [{ name: dx_substr, parameter: { columnIndex: 1, paras: [0, 10] } }]5.3 监控集成我们团队用的PrometheusGranfa方案解析DataX的statistics.json通过pushgateway上报配置监控大盘最后说个真实案例有次凌晨同步任务失败因为没监控早上才发现导致报表出不来。后来加了企业微信告警问题及时率提升90%。