重新编译Flink SQL CDC支持JDK11

重新编译Flink SQL CDC支持JDK11

精选文章moguli202025-05-16 18:56:469A+A-

数据同步中,Flink SQL CDC 是低代码开发的一个很好的选择,无需后端程序员参与,就可以高性能完成从MySQL/PostgreSQL数据同步到kafka/ElaticSearch/其它第三方数据库,数据仓库的工作。

Flink SQL CDC的官方文档如下:

https://github.com/ververica/flink-cdc-connectors

按照官方文档,Flink SQL CDC 是支持JDK11的,但是按照此官方文档,下载

  • flink-sql-connector-mysql-cdc-1.1.0.jar
  • flink-sql-connector-postgres-cdc-1.1.0.jar
  • flink-format-changelog-json-1.1.0.jar

https://github.com/ververica/flink-cdc-connectors/wiki/Downloads

,然后上传到

flink-1.12.1/lib

目录下,重启Flink后,我们按照官方文档创建同步的表

CREATE TABLE mysql_binlog_order (
 order_id STRING NOT NULL,
 cust_user_id STRING,
 cust_cellphone STRING,
 cust_name STRING,
 order_source STRING,
 order_date  STRING,
 pickup_store_code STRING,
 pickup_express_number STRING,
 pay_money  DECIMAL(10,2),
 order_status STRING,
 pay_status STRING,
 pay_info STRING,
 tenantno STRING
) WITH (
 'connector' = 'mysql-cdc',
 'hostname' = '实际IP',
 'port' = '3306',
 'username' = '实际数据库用户名',
 'password' = '实际数据库密码',
 'database-name' = 'hlh',
 'table-name' = 't_order'
);

然后执行 select * from mysql_binlog_order

我们立即就会得到Unsafe.monitorEnter not supported 的错误,就是JDK 11把
sun.misc.Unsafe.monitorEnter()方法移除了,查看Flink SQL CDC的源代码,发现是
com.alibaba.ververica.cdc.debezium.internal.DebeziumChangeConsumer 在101行和106行使用了Unsafe.monitorEnter()方法,入下图所示:

也就是说Flink SQL CDC实际是不支持JDK11的,要么你把JDK版本回退到JDK1.8,要么你怎么想办法去掉Unsafe.monitorEnter()方法,好在有人也给Flink SQL CDC小组提了这个Bug

https://github.com/ververica/flink-cdc-connectors/issues/10

然后一个叫balint133的小哥哥也fixed 了这个Bug,如下图所示:


不知道为什么,该代码至今未合并到Flink SQL CDC 的Master仓库中,所以你下载Flink SQL CDC的master分支源代码,在JDK 11下编译也是错误的,我们要做的就是用balint133小哥哥的源代码替换Fink SQL CDC的master 分支的DebeziumChangeConsumer源代码,其次,别忘记

把pom.xml文件中的CheckStyle插件去掉

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>2.17</version>
                <dependencies>
                    <dependency>
                        <groupId>com.puppycrawl.tools</groupId>
                        <artifactId>checkstyle</artifactId>
                        <version>8.14</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>validate</id>
                        <phase>validate</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <suppressionsLocation>/tools/maven/suppressions.xml</suppressionsLocation>
                    <includeTestSourceDirectory>true</includeTestSourceDirectory>
                    <configLocation>/tools/maven/checkstyle.xml</configLocation>
                    <logViolationsToConsole>true</logViolationsToConsole>
                    <failOnViolation>true</failOnViolation>
                </configuration>
            </plugin>

该插件在Maven打包时,检查代码风格,代码风格有问题时,就会编译失败,也没仔细观察Flink SQL CDC缺省为啥代码检查时编译失败了,把这个插件从Flink SQL CDC的pom.xml文件中去掉,再次打包编译成功。然后再把编译成功的这三个文件拷贝到/home/flink-1.12.1/lib 目录下,重新启动Flink,这时再执行:

select * from mysql_binlog_order

这时SQL执行成功。

然后往该订单表插入一个订单,Flink SQL CDC会实时捕获到该表的数据变化,实时插入到mysql_binlog_order表里,此时利用Flink SQL CDC低代码数据同步成功。

点击这里复制本文地址 以上内容由莫古技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

莫古技术网 © All Rights Reserved.  滇ICP备2024046894号-2