问题描述
通过FlinkCDC同步数据库到Paimon时在Flink Web UI界面发现写入端一直处于忙碌状态,并且Task自动重启了,查看日常日志看到:
异常信息提示由于最近的checkpoint在完成之前过期导致checkpoint执行失败了,一开始怀疑间隔时间设置过短,然后查看了下 flink-conf.yaml 配置项 execution.checkpointing.interval ,发现间隔时间配置为10秒,遂将其改为5min后重新跑作业,然而发现问题依旧。
在Flink UI界面上查看Checkpoint历史信息,点开FAILED可以在里面跳转到日志界面。
在日志界面通过搜索Exception关键字找到错误信息再进行分析,如图:
发现在数据处理过程中出现类型转换错误,我们需要知道Paimon当时正在处理的数据是属于源库的哪张表以及哪个字段,向前翻看日志可以发现日志记录了表名信息,然后我们拿到表名到源数据库查看该表结构信息。
错误提示"0.0"字符串转为INT时出错,从源表数据上看并没有找到0.0的数据,怀疑是Debezium在字段类型映射上导致的。数据从Debezium流转到Paimon时,我加了一行日志打印具体的事件内容,如图:
更新程序重跑作业,在日志中拷贝出JSON格式事件内容,发现了0.0的数值,其对应的字段描述如图:
我们遇到的0.0实际上在SqlServer中的字段类型为:Numeric类型,Debezium官方对Numeric类型的映射为:
可以看到Paimon接收到的事件数据确实是按官方所述的那样,然而在源库上的表看到的数值都是整数类型,而且Paimon对SqlServer的字段类型映射是将Numeric映射为INT,所以就出现了那个类型转换错误。
解决方法
修改Paimon中SqlServer字段类型映射关系,可以将Numeric改为映射成浮点类型。修改Debezium的字段类型映射关系可能不是好的选择,可能会引起其他的问题。
重新编译打包部署后问题解决。