Flink CDC里用Linux脚本编写的CDC任务,同步整库,但是只有一个表在同步数据,怎么回事?

Flink CDC里用Linux脚本编写的CDC任务,同步整库,但是只有一个表在同步数据,这是咋回事?./flink run -Dexecution.checkpointing.interval=60s -Dparallelism.default=1 -c org.apache.doris.flink.tools.cdc.CdcTools /usr/resource/flink/flink-1.18.0/lib/flink-doris-connector-1.18-1.5.0.jar mysql-sync-database --database gaming_center --mysql-conf hostname=127.0.0.1 --mysql-conf server-id=5582 --mysql-conf username=root --mysql-conf password=sjjssWSJNXI_kasnqk --mysql-conf database-name=gaming_center --including-tables "activity_redpack|agent_fair_commission_config|cfg_bonus|cfg_firebase_channel|game_jogo|third_game|tust_pay_log|tust_transfer_log|uwin_pay_withdraw_log" --sink-conf fenodes=127.0.0.1:8030 --sink-conf username=root --sink-conf password= --sink-conf jdbc-url=jdbc:mysql://127.0.0.1:9030 --sink-conf sink.label-prefix=label1 --table-conf replication_num=1

展开
收起
小小鹿鹿鹿 2024-01-24 11:42:28 121 分享 版权
阿里云 AI 助理回答

根据您提供的信息和知识库中的相关资料,以下是可能导致Flink CDC任务中仅有一个表在同步数据的原因分析及解决方法:


1. MySQL Binlog过滤器配置问题

MySQL服务器可能配置了Binlog_Do_DBBinlog_Ignore_DB参数,导致某些表的增量数据无法被Flink CDC捕获。
- 您可以通过以下命令检查MySQL的Binlog过滤器配置:

SHOW MASTER STATUS;

查看结果中的Binlog_Do_DBBinlog_Ignore_DB字段。如果Binlog_Ignore_DB包含gaming_center数据库,或者Binlog_Do_DB未包含gaming_center,则会导致部分表的数据无法同步。

解决方法: - 确保MySQL的Binlog过滤器未忽略gaming_center数据库。 - 如果需要修改Binlog过滤器,请调整MySQL配置文件(如my.cnf)并重启MySQL服务。


2. including-tables正则表达式匹配问题

您在命令中使用了--including-tables参数来指定需要同步的表列表,但可能存在正则表达式匹配不准确的问题。例如: - activity_redpack|agent_fair_commission_config|... 是一个正则表达式,用于匹配表名。 - 如果表名中存在大小写敏感性问题,或者正则表达式未正确匹配所有目标表,则可能导致部分表未被同步。

解决方法: - 确保including-tables参数中的正则表达式能够正确匹配所有目标表。 - 如果表名区分大小写,建议在正则表达式中明确指定大小写,或者使用(?i)标志启用不区分大小写的匹配。例如:

--including-tables "(?i)activity_redpack|agent_fair_commission_config|..."

3. MySQL表结构变更未触发下游同步

如果某些表在全量阶段发生了表结构变更(如新增列、修改列类型等),可能会导致这些表的增量数据无法同步。
根据知识库中的说明,表结构变更的同步依赖于上游表的数据变更事件。如果上游表在全量阶段发生表结构变更,但无新增数据或数据变更事件,则不会触发下游表的同步。

解决方法: - 停止当前作业,删除下游表,并重新启动作业以无状态方式同步数据。 - 避免在同步过程中对上游表进行不兼容的表结构变更。


4. Flink CDC Source配置问题

Flink CDC Source的tableList参数要求表名包含数据库名(如gaming_center.activity_redpack)。如果tableList配置错误,可能导致部分表未被正确识别。

解决方法: - 检查--mysql-conf database-name=gaming_center--including-tables参数是否正确。 - 确保tableList参数中每个表名都包含数据库名。例如:

--including-tables "gaming_center.activity_redpack|gaming_center.agent_fair_commission_config|..."

5. Checkpoint或资源不足问题

如果Flink作业的Checkpoint间隔过长(如60秒),或者Task Manager的CPU资源不足,可能导致部分表的数据未能及时同步。
根据知识库中的说明,finish split response timeout异常通常与Task Manager的CPU资源不足有关。

解决方法: - 调整Checkpoint间隔时间,建议设置为更短的时间(如10秒):

-Dexecution.checkpointing.interval=10s
  • 增加Task Manager的CPU资源,确保作业能够及时响应Coordinator的RPC请求。

6. Sink端配置问题

如果Sink端(如Doris)的表配置存在问题,可能导致部分表的数据无法写入。例如: - Sink端表的主键冲突。 - Sink端表的列类型与源表不一致。

解决方法: - 检查Sink端表的主键配置,确保主键唯一性。 - 确保Sink端表的列类型与源表一致。如果不一致,需手动调整Sink端表的列类型。


总结

根据上述分析,您可以按照以下步骤排查问题: 1. 检查MySQL的Binlog过滤器配置,确保未忽略gaming_center数据库。 2. 确认including-tables正则表达式是否正确匹配所有目标表。 3. 检查是否有表在全量阶段发生表结构变更,并采取相应措施。 4. 确保tableList参数中每个表名都包含数据库名。 5. 调整Checkpoint间隔时间和Task Manager资源。 6. 检查Sink端表的主键和列类型配置。

通过以上步骤,您应该能够定位并解决Flink CDC任务中仅有一个表在同步数据的问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

实时计算Flink版是阿里云提供的全托管Serverless Flink云服务,基于 Apache Flink 构建的企业级、高性能实时大数据处理系统。提供全托管版 Flink 集群和引擎,提高作业开发运维效率。

还有其他疑问?
咨询AI助理