flink cdc connector读取mysql二进制主键导致任务失败
本文将探讨使用 apache flink cdc connector (版本 2.1.1) 读取 mysql 数据时遇到的问题。问题源于 mysql 表的主键使用了二进制格式,导致 flink 任务失败并抛出异常。
问题描述:
在使用 flink-connector-mysql-cdc 2.1.1 监听 mysql 数据库时,如果 mysql 表的主键是二进制类型,则会遇到如下错误:
[pool-79-thread-1] INFO io.debezium.jdbc.JdbcConnection - Connection gracefully closed [SourceCoordinator-Source: MySQL Source -> Sink: Print to Std. Out] ERROR org.apache.flink.runtime.source.coordinator.SourceCoordinator - Uncaught exception in the SplitEnumerator for Source Source: MySQL Source -> Sink: Print to Std. Out while handling operator event RequestSplitEvent (host='') from subtask 0. Triggering job failover. org.apache.flink.util.FlinkRuntimeException: Generate Splits for table 。。。 error ... Caused by: java.lang.ClassCastException: [B cannot be cast to java.lang.Comparable ...
该异常信息表明在 chunksplitter 的 generatesplits 方法中发生了 classcastexception,根本原因是 [b (byte数组) 无法转换为 java.lang.comparable 接口。这通常发生在数据分片过程中,因为 chunksplitter 需要比较主键来划分数据块。由于主键是二进制类型,无法直接进行比较,从而导致类型转换异常。 这并非反序列化问题,而是数据分片阶段的类型兼容性问题。
问题解决:
根据用户反馈,该问题已在 flink cdc connector 的 github 仓库中被报告,并最终通过升级到更新的 flink cdc connector 版本解决。 问题的根本原因在于connector早期版本在处理二进制主键类型的分片逻辑上存在缺陷。 通过升级到修复了该问题的版本,可以避免此错误。