flink cdc 監聽 mysql binary 主鍵時出現 classcastexception
使用 flink cdc 監聽 mysql 時,如果 mysql 表的主鍵是二進制格式,可能會遇到以下錯誤:
caused by: java.lang.classcastexception: [b cannot be cast to java.lang.comparable
登錄后復制
問題分析
此錯誤表明在拆表時出現了問題。flink cdc 將表拆分為更小的分片,用于并行讀取。拆分時,flink 會比較主鍵值以確定分片的邊界。但是,對于二進制格式的主鍵,主鍵值無法直接轉換為可比較的對象,因此會出現 classcastexception。
解決方案
解決此問題的方法是升級到 flink cdc 2.1.2 或更高版本。在這些版本中,已經修復了該問題。此外,還可以通過以下方式解決問題:
- 將 mysql 表的主鍵更改為非二進制格式。
- 使用 flink 提供的 binaryprefixboundednessassigner 來處理二進制主鍵。
具體步驟
將 flink cdc 2.1.1 升級到 2.1.2 或更高版本:
mvn dependency:upgrade -dartifact org.apache.flink:flink-connector-mysql-cdc
登錄后復制
使用 binaryprefixboundednessassigner 來處理二進制主鍵:
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 創建 MySQL source CDCSource<Tuple5<ByteString, ByteString, BigInteger, ByteString, Long>> source = CDCSource.<Tuple5<ByteString, ByteString, BigInteger, ByteString, Long>>builder() .hostname("localhost") .port(3306) .database("test_db") .tableList("test_table") .username("root") .password("root") // 使用 BinaryPrefixBoundednessAssigner 處理二進制主鍵 .assigners(new BinaryPrefixBoundednessAssigner()) .build();
登錄后復制