datax笔记
DataX 简介
DataX 是阿里巴巴开源的一款数据同步工具,支持多种数据源和目标数据的同步,包括 MySQL、Oracle、HDFS 等。使用 DataX 可以快速、可靠地完成数据的迁移和同步。
DataX 工作原理
DataX 的工作原理如下图所示:
DataX 包含三个核心组件:
- Job:描述数据同步的具体步骤和规则。
- Task:Job 的执行单元,负责具体的数据同步操作。
- Scheduler:负责调度 Task 的执行,包括并发执行和任务监控等。
DataX Java 示例
下面是使用 Java 实现 DataX 数据同步的示例代码:
public static void main(String[] args) {
// 配置 DataX 的系统参数
System.setProperty("datax.home", "/path/to/datax/home");
// 加载 Job 配置文件
String jobFilePath = "/path/to/job.json";
Configuration configuration = Configuration.from(new File(jobFilePath));
// 创建 DataX Job 实例
Job job = new DefaultJob(configuration);
// 启动 DataX Job 实例
job.start();
}
其中,datax.home
是 DataX 的安装路径,job.json
是 DataX Job 配置文件的路径。
DataX 常用操作
下面是 DataX 常用的操作:
- 数据源配置
DataX 支持多种数据源,需要根据具体情况进行配置。以 MySQL 数据源为例,配置文件如下:
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"*"
],
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://localhost:3306/source_db"
],
"table": [
"source_table"
]
}
]
}
}
}
]
}
}
其中,username
和 password
分别是 MySQL 数据库的用户名和密码,jdbcUrl
指定连接的数据库和端口号,table
指定需要同步的数据表。
- DataX 运行环境配置
{
"core": {
"transport": {
"channel": {
"speed": 1000
}
}
}
}
其中,channel.speed
指定了数据传输的速度。
- 数据源和目标数据的连接配置
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"*"
],
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://localhost:3306/source_db"
],
"table": [
"source_table"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"*"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://localhost:3306/target_db",
"table": [
"target_table"
]
}
]
}
}
}
]
}
}
其中,username
和 password
分别是 MySQL 数据库的用户名和密码,jdbcUrl
指定连接的数据库和端口号,table
指定同步数据的目标表。
- 数据同步配置
{
"job": {
"content": [
{
"reader": {
"name": "mysqlreader",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"*"
],
"connection": [
{
"jdbcUrl": [
"jdbc:mysql://localhost:3306/source_db"
],
"table": [
"source_table"
]
}
]
}
},
"writer": {
"name": "mysqlwriter",
"parameter": {
"username": "root",
"password": "123456",
"column": [
"*"
],
"connection": [
{
"jdbcUrl": "jdbc:mysql://localhost:3306/target_db",
"table": [
"target_table"
]
}
]
}
}
}
]
}
}
其中,reader
指定数据源配置,writer
指定目标数据配置,column
指定需要同步的列名。
-
数据同步任务调度
{ "job": { "setting": { "speed": { "channel": 3 }, "errorLimit": { "record": 0, "percentage": 0.02 } }, "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "root", "password": "123456", "column": [ "*" ], "connection": [ { "jdbcUrl": [ "jdbc:mysql://localhost:3306/source_db" ], "table": [ "source_table" ] } ] } }, "writer": { "name": "mysqlwriter", "parameter": { "username": "root", "password": "123456", "column": [ "*" ], "connection": [ { "jdbcUrl": "jdbc:mysql://localhost:3306/target_db", "table": [ "target_table" ] } ] } } } ] } }
-
Java 代码示例
下面是一个使用 Java API 调用 DataX 实现数据同步的示例代码:
import com.alibaba.datax.common.exception.DataXException;
import com.alibaba.datax.core.Engine;
import com.alibaba.datax.core.util.ExceptionTracker;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DataXExample {
public static void main(String[] args) {
String jobConfig = "job.json";
Map<String, String> params = new HashMap<>();
List<String> logFiles = new ArrayList<>();
try {
Engine engine = new Engine();
engine.start(jobConfig, params, logFiles);
} catch (Throwable e) {
if (DataXException.isDataXException(e)) {
ExceptionTracker.track(e);
}
System.exit(1);
}
}
}
其中,jobConfig
指定了配置文件的路径,params
和 logFiles
分别是参数和日志文件列表。
- 数据同步流程图
下面是数据同步的流程图:
其中,Reader
模块从源数据读取数据,Writer
模块将数据写入目标数据。Job Scheduler
调度任务并控制整个数据同步的流程。