在数字化转型的浪潮中,企业的数据资产正呈现爆炸式增长。面对庞大的数据体量,如何在不同数据库系统间安全、高效地迁移数据,成为了数据工程师必须掌握的硬核技能。今天,我们就来深入剖析阿里巴巴开源的异构数据源离线同步工具——DataX。
1. DataX简介与核心架构
1.1. DataX简介
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具,致力于实现包括关系型数据库(如 MySQL、Oracle)、HDFS、Hive、MaxCompute(原ODPS)、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。
1.2. DataX设计理念
为了解决异构数据源同步的难题,DataX 创造性地将复杂的网状同步链路变成了星型数据链路。DataX 作为中间的传输载体,负责连接各种数据源。当需要接入一个新的数据源时,只需要将其对接到 DataX,便能与已有的数据源实现无缝同步。
1.3. DataX设计
DataX 采用独特的“Framework + Plugin”架构,将数据源的读取和写入抽象成 Reader/Writer 插件:
- Reader(数据采集模块) :负责采集源数据源的数据,并将数据发送给 Framework。
- Writer(数据写入模块) :负责不断从 Framework 获取数据,并将数据写入到目的端。
- Framework(核心传输通道) :连接 Reader 和 Writer,负责处理缓冲、流控、并发、数据转换等核心技术问题。
1.4. DataX支持数据源
DataX 目前已经有了比较全面的插件体系,主流的 RDBMS 数据库、NOSQL、大数据计算系统都已经接入。
1.5. 核心架构与运行原理
DataX 3.0 支持单机多线程模式运行,其作业生命周期主要包含以下几个核心概念:
- Job(作业) :单个数据同步作业称为一个 Job,DataX 接受到一个 Job 后会启动一个进程来完成整个同步过程。Job 模块负责数据清理、子任务切分以及 TaskGroup 管理。
- Task(子任务) :Job 启动后,会根据源端的切分策略(如按主键分片),将 Job 切分成多个小的 Task。Task 是 DataX 作业的最小单元,每个 Task 负责一部分数据的同步。
- TaskGroup(任务组) :DataX 会根据配置的并发度,将拆分后的 Task 重新组合成 TaskGroup。默认单个任务组的并发数量为 5。
- 运行线程:每一个 Task 启动后,会固定启动
Reader -> Channel -> Writer的线程来完成具体的同步工作。
1.6. 与其他同步工具对比
| 功能 | DataX | Sqoop |
|---|---|---|
| 运行模式 | 单进程 | MR |
| MySQL 读写 | 单机压力大;读写粒度容易控制 | MR模式重,写出错处理麻烦 |
| Hive 读写 | 单机压力大 | 很好 |
| 文件格式 | ORC支持 | ORC不支持,可添加 |
| 分布式 | 不支持,可以通过调度系统规避 | 支持 |
| 流控 | 有流控功能 | 需要定制 |
| 统计信息 | 已有一些统计,上报需要定制 | 没有,分布式的数据收集不方便 |
| 数据校验 | 在core部分有校验功能 | 没有,分布式的数据收集不方便 |
| 监控 | 需要定制 | 需要定制 |
| 社区 | 开源不久,社区不活跃 | 一直活跃,核心部分变动很少 |
2. DataX部署
2.1. 官网地址
Github下载地址:github.com/alibaba/Dat…
2.2. 环境要求
- Linux,推荐 CentOS7以上
- JDK 1.8以上,推荐1.8
- Python(推荐2.6.X)
2.3. DataX安装部署
- 上传下载好的安装包,并解压到指定位置。
tar -zxvf datax.tar.gz -C /opt/module
2. 运行脚本自检。
python ./bin/datax.py ./job/job.json
执行脚本输出以下信息即说明配置成功。
2026-05-16 21:18:41.052 [job-0] INFO JobContainer - PerfTrace not enable!
2026-05-16 21:18:41.052 [job-0] INFO StandAloneJobContainerCommunicator - Total 100000 records, 2600000 bytes | Speed 253.91KB/s, 10000 records/s | Error 0 records, 0 bytes | All Task WaitWriterTime 0.023s | All Task WaitReaderTime 0.030s | Percentage 100.00%
2026-05-16 21:18:41.052 [job-0] INFO JobContainer -
任务启动时刻 : 2026-05-16 21:18:30
任务结束时刻 : 2026-05-16 21:18:41
任务总计耗时 : 10s
任务平均流量 : 253.91KB/s
记录写入速度 : 10000rec/s
读出记录总数 : 100000
读写失败总数 : 0
这样就说明 DataX 安装完成。
3. 实战案例
由于 DataX 主要是异构数据源同步工具,所以下面直接通过几个具体案例,演示如何使用 DataX 在几个数据源之间同步数据。
3.1. MySQL-HDFS
3.1.1. 准备数据库数据
创建t_student表,并插入数据。
CREATE TABLE `t_student` (
`id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '唯一标识',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名',
`gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别',
`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
`tenant_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '租户id',
`create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
INSERT INTO `t_student` VALUES ('1001', 'xiaoLiang', 'male', 'zaoZhuang', 'DOS_DEFAULT_TENANCY', '2026-05-17 08:35:43', NULL);
INSERT INTO `t_student` VALUES ('2001', 'zhaoLiu', 'male', 'jiNan', 'DOS_DEFAULT_TENANCY', '2026-05-17 07:56:38', NULL);
INSERT INTO `t_student` VALUES ('2002', 'zhengQi', 'female', 'ziBo', 'DOS_DEFAULT_TENANCY', '2026-05-17 07:57:03', NULL);
INSERT INTO `t_student` VALUES ('2003', 'tianBa', 'male', 'qingDao', 'ODPT', '2026-05-17 07:57:43', NULL);
INSERT INTO `t_student` VALUES ('1002', 'xiaoMing', 'female', 'dongYing', 'DOS_DEFAULT_TENANCY', '2026-05-17 08:34:55', NULL);
3.1.2. 查看官方模板
通过 DataX 自带脚本命令:python ./bin/datax.py -r mysqlreader -w hdfswriter,查询对应的输入与输出配置模板。
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
Please refer to the mysqlreader document:
https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
Please refer to the hdfswriter document:
https://github.com/alibaba/DataX/blob/master/hdfswriter/doc/hdfswriter.md
Please save the following configuration as a json file and use
python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json
to run the job.
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"password": "",
"username": "",
"where": ""
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [],
"compress": "",
"defaultFS": "",
"fieldDelimiter": "",
"fileName": "",
"fileType": "",
"path": "",
"writeMode": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
mysqlreader 参数解析:
- column:需要同步列名集合,使用 json 数组描述,*代表所有列。
- jdbcUrl:对数据库的 JDBC 连接信息,支持多个连接地址。
- table:需要同步的表,支持多个。
- querySql:自定义 SQL,优先级高,配置 querySql 后,mysqlreader 直接忽略 table/column/where。
- password:数据库密码。
- username:数据库用户名。
- where:筛选条件。
- splitPK:可选,数据分片字段,一般是主键,仅支持整型。
hdfswriter 参数解析:
- column:写入数据的字段,其中 name 指定字段名,type 指定类型。
- compress:hdfs 文件压缩类型,默认不填写,就是没有压缩。
- defaultFS:hdfs 文件系统 namenode 节点地址,格式:
hdfs://ip:port。 - fieldDelimiter:字段分隔符。
- fileName:写入文件名。
- fileType:文件类型,目前只支持用户配置为 text 或 orc。
- path:存储到 hdfs 文件系统的路径。
- writeMode:hdfswriter 定稿前数据清理处理模式。
- append:追加,写前不做处理。
- nonConflict:如果目录下有 fileName 前缀文件,直接报错。
datax 写 hdfs 时,出于数据一致性保证,当整个 job 失败时,可能会有部分并发写入成功,但由于整个任务失败,所以写入成功的部分会被删除。
3.1.3. 类型转换
| Datax内部类型 | Hive数据类型 |
|---|---|
| Long | TINYINT,SMALLINT,INT,BIGINT |
| Double | FLOAT,DOUBLE |
| String | STRING,VARCHAR,CHAR |
| Boolean | BOOLEAN |
| Date | DATE,TIMESTAMP |
3.1.4. 配置文件
根据上面的模板,以及类型对应关系,编写 DataX 配置文件mysql2hdfs.json。
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [
"id",
"name",
"gender",
"address",
"tenant_id",
"create_time",
"update_time"
],
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://192.168.8.102:3306/test"
],
"table": [
"t_student"
]
}
],
"password": "Root@123.",
"username": "root"
}
},
"writer": {
"name": "hdfswriter",
"parameter": {
"column": [
{
"name": "id",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "gender",
"type": "string"
},
{
"name": "address",
"type": "string"
},
{
"name": "tenantId",
"type": "string"
},
{
"name": "createTime",
"type": "string"
},
{
"name": "updateTime",
"type": "string"
}
],
"defaultFS": "hdfs://192.168.8.102:8020",
"fieldDelimiter": "\t",
"fileName": "student.txt",
"fileType": "text",
"path": "/",
"writeMode": "append"
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
注意:
- mysql 列顺序与 hdfs 列顺序必须相同,一一对应,不可以打乱顺序。
- hdfs 的列,必须有列名与类型。
3.1.5. 执行任务
python ./bin/datax.py job/mysql2hdfs.json
2026-05-17 22:30:13.374 [job-0] INFO JobContainer -
任务启动时刻 : 2026-05-17 22:30:00
任务结束时刻 : 2026-05-17 22:30:13
任务总计耗时 : 13s
任务平均流量 : 29B/s
记录写入速度 : 0rec/s
读出记录总数 : 5
读写失败总数 : 0
可以去 HDFS 上查看导入的文件。
datax 写入 Hive 时,没有直接写入 Hive 的方式,官方给出的方式是写入到 HDFS,写入 Hive 其实有两种方式:
- datax 写入 HDFS 中,然后通过 Hive 的 load data 命令将数据加载到 Hive,推荐此方式。
- datax 直接将数据写入 Hive 表对应路径中,这种方式不推荐。
3.1.6. 关于HDFS HA支持
"hadoopConfig": {
"dfs.nameservices": "ns",
"dfs.ha.namenodes.ns": "nn1,nn2",
"dfs.namenode.rpc-address.ns.nn1": "主机名:端口",
"dfs.namenode.rpc-address.ns.nn2": "主机名:端口",
"dfs.client.failover.proxy.provider.ns": "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
}
将上面的配置,直接添加到 hdfswriter 中的 parameter 中即可。
3.2. HDFS-MySQL
与上面示例相反,配置基本一致,具体步骤略… …
模板如下,对应修改配置即可:
{
"job": {
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"column": [],
"defaultFS": "",
"encoding": "UTF-8",
"fieldDelimiter": ",",
"fileType": "orc",
"path": ""
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": "",
"table": []
}
],
"password": "",
"preSql": [],
"session": [],
"username": "",
"writeMode": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
3.3. HDFS-MongoDB
3.3.1. 查看官方模板
通过 DataX 自带脚本命令:python ./bin/datax.py -r hdfsreader -w mongodbwriter,查询对应的输入与输出配置模板。
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
Please refer to the hdfsreader document:
https://github.com/alibaba/DataX/blob/master/hdfsreader/doc/hdfsreader.md
Please refer to the mongodbwriter document:
https://github.com/alibaba/DataX/blob/master/mongodbwriter/doc/mongodbwriter.md
Please save the following configuration as a json file and use
python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json
to run the job.
{
"job": {
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"column": [],
"defaultFS": "",
"encoding": "UTF-8",
"fieldDelimiter": ",",
"fileType": "orc",
"path": ""
}
},
"writer": {
"name": "mongodbwriter",
"parameter": {
"address": [],
"collectionName": "",
"column": [],
"dbName": "",
"upsertInfo": {
"isUpsert": "",
"upsertKey": ""
},
"userName": "",
"userPassword": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
3.3.2. 类型转换
| DataX内部类型 | MongoDB数据类型 |
|---|---|
| Long | int,Long |
| Double | double |
| String | string, array |
| Date | date |
| Boolean | boolean |
| Bytes | bytes |
3.3.3. 配置文件
根据上面的模板,以及类型对应关系,编写 DataX 配置文件hdfs2mongodb.json。
{
"job": {
"content": [
{
"reader": {
"name": "hdfsreader",
"parameter": {
"column": [
{
"name": "id",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "gender",
"type": "string"
},
{
"name": "address",
"type": "string"
},
{
"name": "tenantId",
"type": "string"
},
{
"name": "createTime",
"type": "string"
},
{
"name": "updateTime",
"type": "string"
}
],
"defaultFS": "hdfs://192.168.8.102:8020",
"encoding": "UTF-8",
"fieldDelimiter": "\t",
"fileType": "text",
"path": "/student.txt*"
}
},
"writer": {
"name": "mongodbwriter",
"parameter": {
"address": [
"192.168.8.102:27017"
],
"collectionName": "student",
"column": [
{
"name": "id",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "gender",
"type": "string"
},
{
"name": "address",
"type": "string"
},
{
"name": "tenantId",
"type": "string"
},
{
"name": "createTime",
"type": "date"
},
{
"name": "updateTime",
"type": "date"
}
],
"dbName": "test",
"upsertInfo": {
"isUpsert": "true",
"upsertKey": "id"
}
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
3.3.4. 执行任务
python ./bin/datax.py job/hdfs2mongodb.json
2026-05-17 23:24:38.637 [job-0] INFO JobContainer -
任务启动时刻 : 2026-05-17 23:24:27
任务结束时刻 : 2026-05-17 23:24:38
任务总计耗时 : 11s
任务平均流量 : 34B/s
记录写入速度 : 0rec/s
读出记录总数 : 5
读写失败总数 : 0
3.4. MySQL-PostgreSQL
3.4.1. 查看官方模板
通过 DataX 自带脚本命令:python ./bin/datax.py -r mysqlreader -w postgresqlwriter,查询对应的输入与输出配置模板。
DataX (DATAX-OPENSOURCE-3.0), From Alibaba !
Copyright (C) 2010-2017, Alibaba Group. All Rights Reserved.
Please refer to the mysqlreader document:
https://github.com/alibaba/DataX/blob/master/mysqlreader/doc/mysqlreader.md
Please refer to the postgresqlwriter document:
https://github.com/alibaba/DataX/blob/master/postgresqlwriter/doc/postgresqlwriter.md
Please save the following configuration as a json file and use
python {DATAX_HOME}/bin/datax.py {JSON_FILE_NAME}.json
to run the job.
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": [],
"table": []
}
],
"password": "",
"username": "",
"where": ""
}
},
"writer": {
"name": "postgresqlwriter",
"parameter": {
"column": [],
"connection": [
{
"jdbcUrl": "",
"table": []
}
],
"password": "",
"postSql": [],
"preSql": [],
"username": ""
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
3.4.2. 类型转换
| DataX 内部类型 | PostgreSQL 数据类型 |
|---|---|
| Long | bigint, bigserial, integer, smallint, serial |
| Double | double precision, money, numeric, real |
| String | varchar, char, text, bit |
| Date | date, time, timestamp |
| Boolean | bool |
| Bytes | bytea |
3.4.3. 配置文件
根据上面的模板,以及类型对应关系,编写 DataX 配置文件mysql2postgresql.json。
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"column": [
"id",
"name",
"gender",
"address",
"tenant_id",
"create_time",
"update_time"
],
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://192.168.88.10:3306/test"
],
"table": [
"t_student"
]
}
],
"password": "Root@123.",
"username": "root"
}
},
"writer": {
"name": "postgresqlwriter",
"parameter": {
"column": [
"id",
"name",
"gender",
"address",
"tenant_id",
"create_time",
"update_time"
],
"connection": [
{
"jdbcUrl": "jdbc:postgresql://192.168.88.10:5432/test",
"table": [
"t_student"
]
}
],
"password": "Root@123.",
"username": "postgres"
}
}
}
],
"setting": {
"speed": {
"channel": ""
}
}
}
}
3.4.4. 执行任务
python ./bin/datax.py job/mysql2postgresql.json
2026-05-17 22:50:10.510 [job-0] INFO JobContainer -
任务启动时刻 : 2026-05-17 22:50:59
任务结束时刻 : 2026-05-17 22:51:10
任务总计耗时 : 10s
任务平均流量 : 23B/s
记录写入速度 : 0rec/s
读出记录总数 : 5
读写失败总数 : 0
4. 总结
DataX 凭借其强大的插件体系、精准的流控能力和健壮的容错机制,已经成为异构数据源同步领域的利器。无论是全量迁移还是增量同步,DataX 都能提供稳定高效的解决方案。希望这篇指南能帮助你快速上手 DataX,解锁数据同步的新技能!