flink cdc 監(jiān)聽 mysql binary 主鍵時(shí)出現(xiàn) classcastexception
使用 flink cdc 監(jiān)聽 mysql 時(shí),如果 mysql 表的主鍵是二進(jìn)制格式,可能會(huì)遇到以下錯(cuò)誤:
caused by: java.lang.classcastexception: [b cannot be cast to java.lang.comparable
登錄后復(fù)制
問(wèn)題分析
此錯(cuò)誤表明在拆表時(shí)出現(xiàn)了問(wèn)題。flink cdc 將表拆分為更小的分片,用于并行讀取。拆分時(shí),flink 會(huì)比較主鍵值以確定分片的邊界。但是,對(duì)于二進(jìn)制格式的主鍵,主鍵值無(wú)法直接轉(zhuǎn)換為可比較的對(duì)象,因此會(huì)出現(xiàn) classcastexception。
解決方案
解決此問(wèn)題的方法是升級(jí)到 flink cdc 2.1.2 或更高版本。在這些版本中,已經(jīng)修復(fù)了該問(wèn)題。此外,還可以通過(guò)以下方式解決問(wèn)題:
具體步驟
將 flink cdc 2.1.1 升級(jí)到 2.1.2 或更高版本:
mvn dependency:upgrade -dartifact org.apache.flink:flink-connector-mysql-cdc
登錄后復(fù)制
使用 binaryprefixboundednessassigner 來(lái)處理二進(jìn)制主鍵:
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 創(chuàng)建 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 處理二進(jìn)制主鍵 .assigners(new BinaryPrefixBoundednessAssigner()) .build();
登錄后復(fù)制