DataX 离线数据同步指南
概述
DataX 是阿里巴巴开源的异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。
架构设计
┌──────────────┐
│ Reader │
│ (数据读取) │
└──────────────┘
↓
┌──────────────┐
│ Frame │
│ (核心框架) │
└──────────────┘
↓
┌──────────────┐
│ Writer │
│ (数据写入) │
└──────────────┘
支持的数据库类型
关系型数据库
| 数据库 | Reader | Writer | 说明 |
|---|---|---|---|
| MySQL | ✅ | ✅ | 最常用 |
| Oracle | ✅ | ✅ | 需要 OCI 或 Instant Client |
| PostgreSQL | ✅ | ✅ | 完全支持 |
| SQL Server | ✅ | ✅ | Windows/Linux |
| DB2 | ✅ | ✅ | IBM 大型机 |
| MariaDB | ✅ | ✅ | MySQL 兼容 |
NoSQL 和大数据存储
| 数据源 | Reader | Writer | 说明 |
|---|---|---|---|
| HDFS | ✅ | ✅ | Hadoop 文件系统 |
| Hive | ✅ | ✅ | 数据仓库 |
| HBase | ✅ | ✅ | 列式存储 |
| MongoDB | ✅ | ✅ | 文档数据库 |
| Elasticsearch | ✅ | ✅ | 搜索引擎 |
其他数据源
- FTP / SFTP
- OSS(阿里云对象存储)
- ODPS(阿里云 MaxCompute)
- ClickHouse
- Doris/StarRocks
快速开始
安装 DataX
# 下载 DataX
cd /tmp
wget https://github.com/alibaba/DataX/releases/download/v3.0.0/datax.tar.gz
# 解压
tar -xzf datax.tar.gz
sudo mv datax /opt/datax
sudo chown -R dolphinscheduler:dolphinscheduler /opt/datax
# 配置环境变量
export DATAX_HOME=/opt/datax
export PATH=$DATAX_HOME/bin:$PATH
验证安装
python3 $DATAX_HOME/bin/datax.py --help
集成到 DolphinScheduler
1. 配置环境变量
在 dolphinscheduler_env.sh 中:
# DataX 配置
export DATAX_HOME=/opt/datax
export DATAX_PYTHON=/usr/bin/python3
2. 创建 Shell 任务
在 DS Web UI 中创建 Shell 任务:
#!/bin/bash
# 加载环境变量
source /opt/dolphinscheduler/conf/dolphinscheduler_env.sh
# DataX 作业配置
JOB_CONFIG="/opt/datax/job/mysql_to_hive.json"
# 执行同步
$DATAX_HOME/bin/datax.py $JOB_CONFIG
# 检查结果
if [ $? -eq 0 ]; then
echo "DataX 任务执行成功"
exit 0
else
echo "DataX 任务执行失败"
exit 1
fi
典型应用场景
MySQL → Hive 离线同步
{
"job": {
"setting": {
"speed": {
"channel": 5
},
"errorLimit": {
"record": 0,
"percentage": 0.02
}
},
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "password",
"column": ["*"],
"connection": [
{
"table": ["users"],
"jdbcUrl": ["jdbc:mysql://192.168.192.111:3306/source_db"]
}
],
"where": "update_time >= '${last_sync_time}'"
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"defaultFS": "hdfs://namenode:9000",
"fileType": "text",
"path": "/user/hive/warehouse/users",
"fileName": "users",
"column": [
{"name": "id", "type": "bigint"},
{"name": "name", "type": "string"},
{"name": "age", "type": "int"}
],
"writeMode": "append",
"fieldDelimiter": ","
}
}
}
]
}
}
Oracle → MySQL 迁移
{
"job": {
"setting": {
"speed": {
"channel": 3
}
},
"content": [
{
"reader": {
"name": "oraclereader",
"parameter": {
"username": "scott",
"password": "tiger",
"column": ["*"],
"connection": [
{
"table": ["EMP"],
"jdbcUrl": "jdbc:oracle:thin:@192.168.192.100:1521:orcl"
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "password",
"writeMode": "insert",
"column": ["id", "ename", "job", "mgr", "hiredate", "sal", "comm", "deptno"],
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.192.111:3306/target_db",
"table": ["emp"]
}
]
}
}
}
]
}
}
PostgreSQL → Doris 实时数仓
{
"job": {
"setting": {
"speed": {
"channel": 4
}
},
"content": [
{
"reader": {
"name": "postgresqlreader",
"parameter": {
"username": "postgres",
"password": "password",
"column": ["id", "name", "amount", "create_time"],
"connection": [
{
"jdbcUrl": "jdbc:postgresql://192.168.192.111:5432/source_db",
"table": ["orders"]
}
]
}
},
"writer": {
"name": "doriswriter",
"parameter": {
"username": "root",
"password": "password",
"column": ["id", "name", "amount", "create_time"],
"preSql": ["TRUNCATE TABLE orders"],
"connection": [
{
"jdbcUrl": "jdbc:mysql://192.168.192.140:9030/target_db",
"table": ["orders"]
}
]
}
}
}
]
}
}
性能优化
1. 并发控制
{
"setting": {
"speed": {
"channel": 5, // 并发通道数
"byte": 104857600 // 每秒字节数限制(100MB/s)
}
}
}
2. 错误处理
{
"setting": {
"errorLimit": {
"record": 100, // 允许错误的记录数
"percentage": 0.01 // 错误率阈值(1%)
}
}
}
3. JVM 调优
# 修改 datax.py 中的 JVM 参数
export JAVA_OPTS="-Xms4g -Xmx8g -XX:+HeapDumpOnOutOfMemoryError"
监控与告警
日志位置
/opt/datax/log/datax.log # 主日志
/opt/datax/log/performance.log # 性能日志
/opt/datax/log/stdout.log # 标准输出
监控指标
- 同步速度(records/sec, bytes/sec)
- 错误记录数
- 任务执行时间
- 资源使用率(CPU、内存)
最佳实践
1. 增量同步
使用时间戳字段进行增量同步:
# 获取上次同步时间
LAST_SYNC=$(psql -h pg_host -U postgres -d source_db -c \
"SELECT COALESCE(MAX(update_time), '2000-01-01') FROM sync_log" -t)
# 替换配置文件中的变量
sed -i "s/\${last_sync_time}/$LAST_SYNC/g" job_config.json
# 执行同步
datax.py job_config.json
# 记录本次同步时间
psql -h pg_host -U postgres -d source_db -c \
"INSERT INTO sync_log VALUES (NOW())"
2. 数据一致性校验
-- 源表统计
SELECT COUNT(*), SUM(amount) FROM source_table;
-- 目标表统计
SELECT COUNT(*), SUM(amount) FROM target_table;
-- 对比结果
3. 批量作业管理
#!/bin/bash
# 定义作业列表
JOBS=("job1.json" "job2.json" "job3.json")
# 并行执行
for job in "${JOBS[@]}"; do
python3 $DATAX_HOME/bin/datax.py $job &
done
# 等待所有任务完成
wait
echo "所有作业执行完成"
常见问题
Q1: DataX 和 SeaTunnel 选哪个?
答: 根据场景选择:
-
DataX:
- ✅ 离线同步(批量)
- ✅ 成熟稳定(2015 年开源)
- ✅ 阿里生态
- ❌ 不支持实时 CDC
-
SeaTunnel:
- ✅ 实时同步(CDC)
- ✅ 高性能
- ✅ 多表/复杂转换
- ✅ 新项目首选
Q2: 如何处理大字段?
{
"reader": {
"parameter": {
"fetchSize": 1000, // 分批读取
"querySql": ["SELECT id, name FROM table WHERE condition"]
}
}
}
Q3: 如何保证数据一致性?
- 使用事务(如果目标库支持)
- 先写入临时表,再切换
- 同步后进行数据校验
- 记录同步日志和位点