datax参数设置_datax 优化设置

本文介绍了DataX的执行过程,并提供了三种优化策略:提升每个channel的速度、增加DataX Job内Channel并发数。通过调整job设置中的速度限制和并发数,可以显著提高数据同步效率。同时,需要注意当增加Channel并发数时,可能需要调整JVM heap参数以避免内存溢出。测试结果显示,适当增加并发和速度配置能大幅减少数据同步时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Datax的执行过程

要想进行调优,一般先要了解执行过程,执行过程如下:

2d85b803857b1ad33d2728c17149ad3e.png

过程详细说明如下:

DataX完成单个数据同步的作业,我们称之为Job,DataX接受到一个Job之后,将启动一个进程来完成整个作业同步过程。DataX Job模块是单个作业的中枢管理节点,承担了数据清理、子任务切分(将单一作业计算转化为多个子Task)、TaskGroup管理等功能。

DataXJob启动后,会根据不同的源端切分策略,将Job切分成多个小的Task(子任务),以便于并发执行。Task便是DataX作业的最小单元,每一个Task都会负责一部分数据的同步工作。

切分多个Task之后,DataX Job会调用Scheduler模块,根据配置的并发数据量,将拆分成的Task重新组合,组装成TaskGroup(任务组)。每一个TaskGroup负责以一定的并发运行完毕分配好的所有Task,默认单个任务组的并发数量为5。

每一个Task都由TaskGroup负责启动,Task启动后,会固定启动Reader—>Channel—>Writer的线程来完成任务同步工作。

DataX作业运行起来之后, Job监控并等待多个TaskGroup模块任务完成,等待所有TaskGroup任务完成后Job成功退出。否则,异常退出,进程退出值非0

简单总结过程如下:

一个DataX Job会切分成多个Task,每个Task会按TaskGroup进行分组,一个Task内部会有一组Reader->Channel->Writer。Channel是连接Reader和Writer的数据交换通道,所有的数据都会经由Channel进行传输

根据过程,我们可以进行如下优化

优化1:提升每个channel的速度

在DataX内部对每个Channel会有严格的速度控制,分两种,一种是控制每秒同步的记录数,另外一种是每秒同步的字节数,默认的速度限制是1MB/s,可以根据具体硬件情况设置这个byte速度或者record速度,一般设置byte速度,比如:我们可以把单个Channel的速度上限配置为5MB

优化2:提升DataX Job内Channel并发数 并发数=taskGroup的数量每一个TaskGroup并发执行的Task数 (默认单个任务组的并发数量为5)。

提升job内Channel并发有三种配置方式:

配置全局Byte限速以及单Channel Byte限速,Channel个数 = 全局Byte限速 / 单Channel Byte限速

配置全局Record限速以及单Channel Record限速,Channel个数 = 全局Record限速 / 单Channel Record限速

直接配置Channel个数.

配置含义:

job.setting.speed.channel : channel并发数

job.setting.speed.record : 全局配置channel的record限速

job.setting.speed.byte:全局配置channel的byte限速

core.transport.channel.speed.record:单channel的record限速

core.transport.channel.speed.byte:单channel的byte限速

方式1:

举例如下:core.transport.channel.speed.byte=1048576,job.setting.speed.byte=5242880,所以Channel个数 = 全局Byte限速 / 单Channel Byte限速=5242880/1048576=5个,配置如下:

{"core": {"transport": {"channel": {"speed": {"byte": 1048576}

}

}

},"job": {"setting": {"speed": {"byte" : 5242880}

},

...

}

}

方式2:

举例如下:core.transport.channel.speed.record=100,job.setting.speed.record=500,所以配置全局Record限速以及单Channel Record限速,Channel个数 = 全局Record限速 / 单Channel Record限速=500/100=5

{"core": {"transport": {"channel": {"speed": {"record": 100}

}

}

},"job": {"setting": {"speed": {"record" : 500}

},

...

}

}

方式3:

举例如下:直接配置job.setting.speed.channel=5,所以job内Channel并发=5个

{"job": {"setting": {"speed": {"channel" : 5}

},

...

}

}

注意事项

当提升DataX Job内Channel并发数时,调整JVMheap参数,原因如下:

- 当一个Job内Channel数变多后,内存的占用会显著增加,因为DataX作为数据交换通道,在内存中会缓存较多的数据。

- 例如Channel中会有一个Buffer,作为临时的数据交换的缓冲区,而在部分Reader和Writer的中,也会存在一些Buffer,为了防止jvm报内存溢出等错误,调大jvm的堆参数。

- 通常我们建议将内存设置为4G或者8G,这个也可以根据实际情况来调整

- 调整JVM xms xmx参数的两种方式:一种是直接更改datax.py;另一种是在启动的时候,加上对应的参数,如下:

python datax/bin/datax.py --jvm="-Xms8G -Xmx8G" XXX.json

Channel个数并不是越多越好, 原因如下:

- Channel个数的增加,带来的是更多的CPU消耗以及内存消耗。

- 如果Channel并发配置过高导致JVM内存不够用,会出现的情况是发生频繁的Full GC,导出速度会骤降,适得其反。这个可以通过观察日志发现

测试使用datax从mysql到mysql,不同配置测试效果如下:

使用默认单个channel 限速1M/s,测试情况如下,1660s跑完:

466f870bff4e1bdc7db599bbec72bc1d.png

使用单通道,5M/s,测试情况如下,50s跑完:

64ba50e923b3c7d5627bf3bbae323154.png

使用5通道,5M/s,测试情况如下,10s跑完:

76ae160a3d2847ff8e02bd6910c2795c.png

注意:

MysqlReader进行数据抽取时,如果指定splitPk,表示用户希望使用splitPk代表的字段进行数据分片,DataX因此会启动并发任务进行数据同步,这样可以大大提供数据同步的效能,splitPk不填写,包括不提供splitPk或者splitPk值为空,DataX视作使用单通道同步该表数据,第三个测试不配置splitPk测试不出来效果

调优没有固定的,先了解原理,再根据原理及执行过程进行局部或者全局的调优,谢谢各位阅读

### 配置 DolphinScheduler 使用 DataX 实现 MySQL 到 MySQL 的数据同步 #### 1. 环境准备 在配置 DolphinScheduler 和 DataX 前,需确保环境已正确搭建并满足以下条件: - 已完成 DolphinScheduler 集群部署[^2]。 - 安装并验证 DataX 可正常运行[^3]。 #### 2. 创建 DataX JSON 配置文件 DataX 使用 JSON 文件定义任务参数。以下是实现 MySQL 到 MySQL 数据同步的一个基本模板: ```json { "job": { "content": [ { "reader": { "name": "mysqlreader", "parameter": { "username": "source_db_user", // 源库用户名 "password": "source_db_password", // 源库密码 "column": ["*"], // 同步字段列表 "connection": [ { "jdbcUrl": ["jdbc:mysql://source_host:port/source_database_name"], // 源库连接地址 "table": ["source_table"] // 源表名称 } ] } }, "writer": { "name": "mysqlwriter", "parameter": { "writeMode": "insert", // 写入模式:insert/update/replace等 "username": "target_db_user", // 目标库用户名 "password": "target_db_password", // 目标库密码 "column": ["col1", "col2", ...], // 字段映射 "preSql": [], // 执行前SQL语句 "postSql": [], // 执行后SQL语句 "connection": [ { "jdbcUrl": "jdbc:mysql://target_host:port/target_database_name", // 目标库连接地址 "table": ["target_table"] // 目标表名称 } ] } } } ], "setting": { "speed": { "channel": "3" // 并发通道数量 } } } } ``` 上述 JSON 文件中,`reader` 表示源数据库读取器,`writer` 表示目标数据库写入器。需要根据实际需求调整 `username`, `password`, `jdbcUrl`, `table`, `column` 等参数[^1]。 #### 3. 测试 DataX 脚本 将生成的 JSON 文件保存到 DataX 的工作目录下(如 `/opt/module/datax/job/mysql_to_mysql.json`),并通过以下命令测试脚本是否能成功执行: ```bash python2 /opt/module/datax/bin/datax.py /opt/module/datax/job/mysql_to_mysql.json ``` 如果脚本无误,则可以继续将其集成到 DolphinScheduler 中。 #### 4. 在 DolphinScheduler 中创建 DataX 任务 进入 DolphinScheduler 控制台,在流程定义页面新增一个任务节点,并选择 **Shell 类型** 或 **DataX 插件类型**(视版本支持情况而定)。 如果是 Shell 类型的任务,输入如下命令以调用 DataX 脚本: ```bash cd /opt/module/datax && python2 bin/datax.py job/mysql_to_mysql.json ``` #### 5. 参数化与动态变量 为了提高灵活性,可以在 DolphinScheduler 中设置全局参数或传递动态变量给 DataX 脚本。例如: - 将 JDBC URL、用户名、密码等敏感信息作为任务参数传入; - 动态指定要同步的表名或列名。 具体操作方法可参考官方文档中的自定义参数部分。 --- ### 注意事项 - 确保源库和目标库之间的网络连通性良好。 - 如果涉及大数据量迁移,建议优化 `speed.channel` 参数以及分批处理逻辑。 - 对于增量同步场景,可在 JSON 文件中加入时间戳过滤条件或其他唯一标识符来控制范围。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值