Flink CDC运行一段时间时间会出现这个异常 有遇见过吗?

Flink CDC运行一段时间时间会出现这个异常 有大佬遇见过吗?Caused by: com.github.shyiko.mysql.binlog.event.deserialization.MissingTableMapEventException: No TableMapEventData has been found for table id:74521. Usually that means that you have started reading binary log 'within the logical event group' (e.g. from WRITE_ROWS and not proceeding TABLE_MAP
at com.github.shyiko.mysql.binlog.event.deserialization.AbstractRowsEventDataDeserializer.deserializeRow(AbstractRowsEventDataDeserializer.java:109)
at com.github.shyiko.mysql.binlog.event.deserialization.WriteRowsEventDataDeserializer.deserializeRows(WriteRowsEventDataDeserializer.java:64)
at com.github.shyiko.mysql.binlog.event.deserialization.WriteRowsEventDataDeserializer.deserialize(WriteRowsEventDataDeserializer.java:56)
at com.github.shyiko.mysql.binlog.event.deserialization.WriteRowsEventDataDeserializer.deserialize(WriteRowsEventDataDeserializer.java:32)
at com.github.shyiko.mysql.binlog.event.deserialization.EventDeserializer.deserializeEventData(EventDeserializer.java:335)
... 6 more

展开
收起
真的很搞笑 2023-10-18 16:35:02 323 分享 版权
阿里云 AI 助理回答

根据您提供的异常信息,MissingTableMapEventException 表示在读取 MySQL Binlog 时,Flink CDC 无法找到与指定表 ID 对应的 TableMapEventData。这通常是由于 Binlog 的读取位置不正确或 Binlog 数据不完整导致的。以下是可能的原因及解决方案:


问题原因

  1. Binlog 文件过期

    • MySQL 的 Binlog 文件可能已被清理,导致 Flink CDC 无法从指定的位点继续读取。
    • 这通常发生在 MySQL 配置的 expire_logs_days 参数值较小的情况下。
  2. Binlog 格式问题

    • 如果 MySQL 的 Binlog 格式为 MixedStatement,可能会导致某些事件无法被正确解析。
    • Flink CDC 推荐使用 ROW 格式的 Binlog。
  3. 作业重启后消费位置错误

    • 如果作业重启时未正确保存或恢复 Binlog 位点,可能会导致从错误的位置开始读取 Binlog。
  4. 并发读取问题

    • 多个 CDC 作业同时读取同一个 MySQL 实例的 Binlog,可能导致数据竞争或位点丢失。

解决方案

1. 检查并调整 MySQL 的 Binlog 配置

  • 确保 MySQL 的 Binlog 格式为 ROW

    SHOW VARIABLES LIKE 'binlog_format';
    SET GLOBAL binlog_format=ROW;
    

    如果当前格式为 MixedStatement,请将其更改为 ROW

  • 增加 Binlog 的保留时间,避免文件过期:

    SHOW VARIABLES LIKE 'expire_logs_days';
    SET GLOBAL expire_logs_days=7;
    

    建议将 expire_logs_days 设置为至少 7 天,以确保 Binlog 文件不会被过早清理。

2. 确保作业重启时正确恢复消费位置

  • 在 Flink CDC 中,可以通过以下方式控制作业重启时的消费位置:
    • 全新启动:从最早的 Binlog 位点开始消费。
    • 从最新状态恢复:从作业停止时的位点继续消费。
    • 配置参数 scan.startup.mode 来指定消费模式:
    scan.startup.mode=earliest-offset
    

    scan.startup.mode=latest-offset
    

3. 检查数据库权限

  • 确保用于连接 MySQL 的用户具有足够的权限,能够访问所有涉及的表和数据库。
  • 如果使用了 'debezium.snapshot.mode'='never',建议移除该配置,或者设置以下参数以避免 Schema 不一致的问题:
    debezium.inconsistent.schema.handling.mode=warn
    

4. 分析日志并定位具体问题

  • 查看 Flink 作业的日志,确认是否有类似以下的警告或错误信息:
    io.debezium.connector.mysql.MySqlSchema WARN
    

    日志中会打印出具体的变更详情,帮助定位问题。

5. 减少数据库压力

  • 如果多个 CDC 作业同时运行,可能会导致数据库压力过大,进而影响 Binlog 的读取。可以采取以下措施:
    • 将表同步到 Kafka 消息队列中,通过消费 Kafka 数据进行解耦。
    • 合并多个 CDC 作业为一个作业,并为每个 MySQL CDC 源表配置相同的 Server ID,实现数据源复用。

重要提醒

  • Binlog 格式必须为 ROW:Flink CDC 依赖于 ROW 格式的 Binlog 来捕获数据变更,其他格式可能导致解析失败。
  • 合理设置 Binlog 保留时间:如果 Binlog 文件被清理,Flink CDC 将无法从指定的位点继续读取,可能导致数据丢失。
  • 检查作业配置:确保 scan.startup.mode 和其他相关参数配置正确,避免因消费位置错误导致的问题。

通过以上步骤,您可以有效解决 MissingTableMapEventException 异常问题。如果问题仍然存在,请进一步分析日志并提供更多上下文信息以便深入排查。

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

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

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