Apache Seatunnel批量插入配置咨询:CDC同步效率优化
问题:Apache Seatunnel CDC同步MySQL时如何实现批量插入提升效率
我已经成功安装Apache Seatunnel 2.3.1,在源MySQL执行100万条记录的CSV数据加载后,发现Seatunnel通过100万次单条插入同步到目标MySQL 8.0.33。想优化成批量插入(比如每次10万条),请问目标MySQL或CDC是否支持基于最后获取ID的批量插入?
我的CDC配置文件如下:
env { job.mode = "STREAMING" parallelism = 2 } source { MySQL-CDC { result_table_name="mysql-exactly-once" parallelism = 2 server-id = 5656 username = "hadoopuser" password = "Ambariuser.123" database-names = ["demo"] table-names = ["demo.source"] base-url = "jdbc:mysql://instance-3:3306/demo" startup.mode ="LATEST" } } sink{ console { source_table_name="mysql-exactly-once" } jdbc { source_table_name="mysql-exactly-once" url = "jdbc:mysql://instance-4:3306/demo" driver = "com.mysql.cj.jdbc.Driver" max_retries = 0 user = "hadoopuser" password = "Ambariuser.123" query = "insert into dest(id,name) values(?,?)" is_exactly_once = "true" xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource" }}
解决方案
1. 直接开启JDBC Sink的批量插入
Seatunnel的JDBC Sink自带批量插入支持,不用搞基于ID的复杂逻辑,只要加几个配置参数就行:
batch_size: 设定每次批量提交的记录数,比如你要的10万就设100000,可以根据实际性能调整(建议先从1万测起,找到最优值)batch_interval: 可选参数,设置超时时间(比如1000毫秒),如果到了时间还没攒够batch_size的量,也会自动提交,避免数据积压
修改后的JDBC Sink配置:
jdbc { source_table_name="mysql-exactly-once" url = "jdbc:mysql://instance-4:3306/demo" driver = "com.mysql.cj.jdbc.Driver" max_retries = 0 user = "hadoopuser" password = "Ambariuser.123" query = "insert into dest(id,name) values(?,?)" is_exactly_once = "true" xa_data_source_class_name = "com.mysql.cj.jdbc.MysqlXADataSource" # 新增批量配置 batch_size = 100000 batch_interval = 1000 }
2. 关于基于ID的批量插入
MySQL本身支持insert into dest(id,name) values(?,?), (?,?), ...这种批量语法,Seatunnel的JDBC Sink会自动把攒好的批量数据转换成这种格式提交,不用你手动写批量SQL。
至于你问的基于最后获取ID的批量逻辑,一般是用于主动拉取数据的场景(比如定时全量同步),但你现在用的是CDC模式,是实时捕获源库的变更事件推过来的,不需要主动按ID范围去拉数据。如果是全量同步阶段(比如用initial启动模式),Seatunnel的MySQL-CDC会自动批量读取全量数据,配合JDBC Sink的批量插入就能大幅提升效率。
3. 注意点
- 开了批量插入后,
is_exactly_once的配置可以保留,Seatunnel会通过XA事务保证批量提交的一致性,不会丢数据 - 调整
batch_size时要注意目标MySQL的max_allowed_packet参数,别让单条批量SQL超过这个限制,否则会报错 - 并行度(
parallelism)和batch_size要配合着调,避免每个并行任务攒半天都凑不够批量数,反而降低效率
内容的提问来源于stack exchange,提问作者arjun s
相关产品推荐
相关产品推荐

