DataX异构数据源同步工具:从原理到实战全方位指南

63 阅读11分钟

在数字化转型的浪潮中,企业的数据资产正呈现爆炸式增长。面对庞大的数据体量,如何在不同数据库系统间安全、高效地迁移数据,成为了数据工程师必须掌握的硬核技能。今天,我们就来深入剖析阿里巴巴开源的异构数据源离线同步工具——DataX。

1. DataX简介与核心架构

1.1. DataX简介

DataX

DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具,致力于实现包括关系型数据库(如 MySQL、Oracle)、HDFS、Hive、MaxCompute(原ODPS)、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。

1.2. DataX设计理念

为了解决异构数据源同步的难题,DataX 创造性地将复杂的网状同步链路变成了星型数据链路。DataX 作为中间的传输载体,负责连接各种数据源。当需要接入一个新的数据源时,只需要将其对接到 DataX,便能与已有的数据源实现无缝同步。

Data设计架构

1.3. DataX设计

DataX 采用独特的“Framework + Plugin”架构,将数据源的读取和写入抽象成 Reader/Writer 插件:

  • Reader(数据采集模块) :负责采集源数据源的数据,并将数据发送给 Framework。
  • Writer(数据写入模块) :负责不断从 Framework 获取数据,并将数据写入到目的端。
  • Framework(核心传输通道) :连接 Reader 和 Writer,负责处理缓冲、流控、并发、数据转换等核心技术问题。

DataX设计架构

1.4. DataX支持数据源

DataX 目前已经有了比较全面的插件体系,主流的 RDBMS 数据库、NOSQL、大数据计算系统都已经接入。

参考:github.com/alibaba/Dat…

DataX支持数据源

1.5. 核心架构与运行原理

Data运行架构

DataX 3.0 支持单机多线程模式运行,其作业生命周期主要包含以下几个核心概念:

  1. Job(作业) :单个数据同步作业称为一个 Job,DataX 接受到一个 Job 后会启动一个进程来完成整个同步过程。Job 模块负责数据清理、子任务切分以及 TaskGroup 管理。
  2. Task(子任务) :Job 启动后,会根据源端的切分策略(如按主键分片),将 Job 切分成多个小的 Task。Task 是 DataX 作业的最小单元,每个 Task 负责一部分数据的同步。
  3. TaskGroup(任务组) :DataX 会根据配置的并发度,将拆分后的 Task 重新组合成 TaskGroup。默认单个任务组的并发数量为 5。
  4. 运行线程:每一个 Task 启动后,会固定启动 Reader -> Channel -> Writer 的线程来完成具体的同步工作。

1.6. 与其他同步工具对比

功能DataXSqoop
运行模式单进程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安装部署

  1. 上传下载好的安装包,并解压到指定位置。
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数据类型
LongTINYINT,SMALLINT,INT,BIGINT
DoubleFLOAT,DOUBLE
StringSTRING,VARCHAR,CHAR
BooleanBOOLEAN
DateDATE,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数据类型
Longint,Long
Doubledouble
Stringstring, array
Datedate
Booleanboolean
Bytesbytes

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 数据类型
Longbigint, bigserial, integer, smallint, serial
Doubledouble precision, money, numeric, real
Stringvarchar, char, text, bit
Datedate, time, timestamp
Booleanbool
Bytesbytea

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,解锁数据同步的新技能!