Flink SQL Connector JDBC目前只支持Mysql,Derby和Postgres,但是oracle和sqlserver可以通过JDBC connector自己扩展。目前只能修改重编FLINK源码实现扩展,社区正在积极对此进行抽象和改造,未来应该会有更好的接口扩展方式。
目录
2.3 Flink JDBC SQLServer connector实现
2.实现SQLServerDialect并重写getUpsertStatement
3.将SQLServerDialect注册到JdbcDialects中
3.调用jdbc connector链接oracle/sqlserver
1.编译FLINK源码
从flink官网提供的github链接下载源码,因为我是用IDE编译所以直接下载zip包,解压后直接用IDE打开就行。
所有Flink的组件都在,maven加载依赖需要比较长时间。依赖包可能无法一次顺利下载完成,中间会报某些包(尤其是maven插件)下载失败。
找到flink-connectors下面的flink-connector-jdbc这个工程,我们只编译它。(当然你也可以都编译,只是时间比较长。)未修改先编译一次的目的是为了排除修改后编译不通过的原因是源码本身导致的。
看到BUILD-SECCESS说明编译成功了。
中途遇到两个问题:
1.依赖下载失败
删除本地maven仓库中的jar包目录后会重新下载,直到所有包都下载完成。对于访问外网有麻烦的童鞋可以换成阿里云的maven仓库地址https://maven.aliyun.com/repository/apache-snapshots。
2.要求代码格式化
应该是Flink源码中要求的,编译会提示使用mvn spotless进行格式化。但是IDE中默认maven仓库地址是10.10.xx,总是执行失败。查询该命令后发现可以指定自己的setting.xml,命令如下:
mvn spotless:apply -s C:\Users\xxx\.m2\settings.xml
从终端进入flink-connector-jdbc的目录后,顺利执行,再次编译即可。
2.SQLSERVER JDBC扩展示例
2.1 Flink JDBC源码简介
通过源码浏览发现Flink将实现的connector接口注册在org.apache.flink.connector.jdbc.dialect.JdbcDialects中:
private static final List<JdbcDialect> DIALECTS =
Arrays.asList(
new DerbyDialect(),
new MySQLDialect(),
new PostgresDialect(),
);
每个Dialect都扩展自AbstractDialect,比如MySQL的:
/** JDBC dialect for MySQL. */
public class MySQLDialect extends AbstractDialect
而AbstractDialect继承自JdbcDialect,JdbcDialect中已经实现了通用的CURD接口:
- getSelectFromStatement
- getDeleteStatement
- getUpdateStatement
- getInsertIntoStatement
MySQLDialect自己重写了getUpsertStatement实现upsert。
2.2 Flink JDBC扩展思路
根据上面的介绍,只要仿照MySQLDialect编写SQLServerDialect。需要实现2个类,分别是SQLServerDialect和SQLServerRowConverter,SQLServerDialect会引用SQLServerRowConverter,并重写getUpsertStatement实现upsert。最后将SQLServerDialect注册到JdbcDialects中即可。Oracle的实现过程也是一样的。
2.3 Flink JDBC SQLServer connector实现
1.实现SQLServerRowConverter
在包org.apache.flink.connector.jdbc.internal.converter中新建SQLServerRowConverter,可以直接复制M