FLINK CLIENT 使用JDBC填坑

1,349 阅读3分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

最近在测试工作中遇到不少流计算的需求,依托于公司现有流计算平台,数据开发通过flinkSQL来进行需求实现。目前主要是已SQL来提交job.在验收调试过程中遇到了比较大的麻烦,于是就打算使用flink client 来进行一些简单的逻辑验算。这其中就遇到了要使用flink 连接MySQL来创建维度表的问题。 本文主要介绍一下如何使用flink sql连接数据库。以及期间碰到的问题和解决方案。

JDBC SQL Connector

问题和现象

刚开始通过查阅git代码提交记录,可以看到开发提交的SQL如下

create table testsuit
(
    testsuit_id int,
    project_id string
) WITH (
    'connector' = 'jdbc',
    'url' = 'jdbc:mysql://192.168.20.187:3306/data_test?characterEncoding=utf-8',
    'table-name' = 'testsuit',
    'connection—name' = 'test',
    'driver' = 'com.mysql.cj.jdbc.Driver',
    'lookup.cache.max-rows' = '10',
    'lookup.cache.ttl' = '1min',
    'username'='root',
    'password'='mini123'
);

于是直接贴进client 命令行交互中。如何使用client在之前有介绍过flink sql-client 菜鸟记录。执行倒是挺正常

image.png 进行查询报错

Could not find any factory for identifier ‘jdbc‘

提示对jdb找不到实现类进行处理。于是找了一下官方说明

解决

添加jdbc依赖到flink sql客户端 参照官网需要添加如下两个jar包

image.png

flink 官网指南

下载完成以后放入安装目录的lib包下

image.png

再次尝试,仍报错如下

Flink SQL> select * from testsuit;
[ERROR] Could not execute SQL statement. Reason:
java.lang.ClassCastException: org.codehaus.janino.CompilerFactory cannot be cast to org.codehaus.commons.compiler.ICompilerFactory

这个问题的报错一度让我毫无办法,查看log日志,是来自深层次的底层报错,显然对于半桶水的我有点招架不住,于是在搜索了一圈后发现了如下解决方案。

修改/conf/flink-conf.yaml中classloader.resolve-order: parent-first

再次尝试,仍报错如下

image.png

根据提示,查阅官方文档,发现connection—name' = 'test不在jdbc连接的选项中。那么为什么开发的sql可以那么写?这里有一个问题后面讨论。根据提示去除该选项,继续执行。

image.png

执行成功。

jdbc 选项(1.13.0)

OptionRequiredDefaultTypeDescription
connectorrequired(none)String指定使用的连接器,这里必须是 'jdbc'.
urlrequired(none)String链接URL
table-namerequired(none)String需要连接的表名
driveroptional(none)String使用的JDBC驱动实现类,如果未指明,则根据URL自动识别
usernameoptional(none)String用户名,与密码必须同时设置
passwordoptional(none)String密码
connection.max-retry-timeoutoptional60sDuration最大重试间隔时间s
scan.partition.columnoptional(none)String分区字段,详细请看 Partitioned Scan 
scan.partition.numoptional(none)Integer分区个数
scan.partition.lower-boundoptional(none)Integer最小分区值
scan.partition.upper-boundoptional(none)Integer最大分区值
scan.fetch-sizeoptional0Integer每次读取时应从数据库中提取的行数。如果指定的值为零,则忽略提示。
scan.auto-commitoptionaltrueBoolean在JDBC驱动程序上设置自动提交标志,该标志决定是否在事务中自动提交每个语句。一些JDBC驱动程序,特别是Postgres,可能需要将这个值设置为false,以便以流方式输出结果。
lookup.cache.max-rowsoptional(none)Integer缓存最大行数,超过行数则过期,详细请看Lookup Cache 
lookup.cache.ttloptional(none)Duration缓存最大时间,超过则过期,详细请看Lookup Cache 
lookup.max-retriesoptional3Integer更新缓存最大失败重试次数
sink.buffer-flush.max-rowsoptional100Integer最大flush前缓存池大小,设置为0则关闭
sink.buffer-flush.intervaloptional1sDuration刷新间隔,在此期间,异步线程将刷新数据。可以设置为“0”以禁用它。注意,”sink.buffer-flush。Max-rows '可以设置为'0',并设置刷新间隔以允许对缓冲动作进行完全异步处理。
sink.max-retriesoptional3Integer最大写失败重试次数
sink.parallelismoptional(none)Integer设置写操作并行度,默认情况下,会有系统自行决定。

以上是先行最新版本1.13所支持的所有选项。至于为什么会出现有选项在client中不支持,在平台却支持的情况。后续如果有解答,再行更新。关于选项的更深层次的内容,可以访问flink官方文档进行查阅。