【flink实战】flink-connector-mysql-cdc导致mysql连接器报类型转换错误

本文主要是介绍【flink实战】flink-connector-mysql-cdc导致mysql连接器报类型转换错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一. 报错现象
  • 二. 方案二:重新编译打包flink-connector-cdc
    • 1. 排查脚本
    • 2. 重新编译打包flink-sql-connector-mysql-cdc-2.4.0.jar
    • 3. 测试flink环境
  • 三. 方案一:改造flink连接器

一. 报错现象

在这里插入图片描述
flink sql任务是:mysql到hdfs的离线任务,flink在消费mysql时报如上错误。

根据经验:mysql 8.x版本会将Timestamp数据类型转换为localdatetime类型,而flink 连接器中并未做此适配,导致任务消费数据后,类型转换报错。

 
解决方案有两种:

  1. flink 连接器兼容mysql 8.x,
  2. 找到mysql 8.x驱动所在的连接器,去掉mysql 8.x驱动。

这里先尝试使用第二种方案。

 

二. 方案二:重新编译打包flink-connector-cdc

1. 排查脚本

在flink lib目录下查找含有mysql8驱动的jar

#!/usr/bin/env bashls  | while read one_line
doclass_name=$(jar -vtf $one_line |grep 'com/mysql/cj/jdbc/Driver.class')if [[  ${class_name}x != "x"  ]]; thenecho "jar:$one_line  contains the ${class_name}"fi
done
bash check_driver.sh
java.util.zip.ZipException: error in opening zip file
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:219)
at java.util.zip.ZipFile.<init>(ZipFile.java:149)
at java.util.zip.ZipFile.<init>(ZipFile.java:120)
at sun.tools.jar.Main.list(Main.java:1115)
at sun.tools.jar.Main.run(Main.java:293)
at sun.tools.jar.Main.main(Main.java:1288)
jar:flink-sql-connector-mysql-cdc-2.4.0.jar contains the 730 Thu Dec 16 00:25:38 CST 2021 com/mysql/cj/jdbc/Driver.class
java.util.zip.ZipException: zip file is empty
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(ZipFile.java:219)
at java.util.zip.ZipFile.<init>(ZipFile.java:149)
at java.util.zip.ZipFile.<init>(ZipFile.java:120)
at sun.tools.jar.Main.list(Main.java:1115)
at sun.tools.jar.Main.run(Main.java:293)
at sun.tools.jar.Main.main(Main.java:1288)

发现只有flink-sql-connector-mysql-cdc-2.4.0 jar含有mysql8.x版本的驱动。
 

2. 重新编译打包flink-sql-connector-mysql-cdc-2.4.0.jar

修改方式如下
在这里插入图片描述
 

3. 测试flink环境

经过重新编译打包后的flink-sql-connector-mysql-cdc-2.4.0.jar中就不包含mysql8.x版本的驱动了,又因为提交任务时,会加载flink lib下所有的jar,故保证此目录下有mysql5.x的包,但不包含mysql8.x即可。

现测试包含mysql5.x的驱动 mysql cdc的任务是否能够正常启动。

测试,报无法初始化MySqlConnectorConfig
在这里插入图片描述

在这里插入图片描述

 
单独添加mysql-connector-java-8.0.28.jar到flink lib后运行正常,说明此版本驱动是必要的。
在这里插入图片描述

 

三. 方案一:改造flink连接器

再来关注下一开始的报错堆栈信息:
在这里插入图片描述

报错的位置在SqlConverter,没有兼容mysql 8.x的驱动,这里兼容也比较简单:

具体分析原因也可见我之前的文章:

【源码改造】flink JDBC connector 源码改造之 类型转换 java.time.LocalDateTime cannot be cast to java.sql.Timestamp

在连接器中添加对LocalDateTime数据类型的适配,

 case TIMESTAMP_WITH_TIME_ZONE:case TIMESTAMP_WITHOUT_TIME_ZONE:return val -> {if (val instanceof LocalDateTime) {return TimestampData.fromTimestamp(Timestamp.valueOf((LocalDateTime) val));}return TimestampData.fromTimestamp((Timestamp) val);};

这里还需要一点,因为使用的是chunjun的连接器,mysql连接器依赖chunjun-connector-jdbc-base模块,具体的converter也由此模块实现,如果修改此模块,其他依赖此模块的连接器也需要重新打包上传,所以这里需要实现mysql的sqlconverter,以最小化修改的方式修改。

 

具体见我提到chunjun的pr:
[Feature-#1899][connector][mysql] The connector supports MySQL Driver 8.x #1900

这篇关于【flink实战】flink-connector-mysql-cdc导致mysql连接器报类型转换错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1068411

相关文章

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例