这是我参与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 菜鸟记录。执行倒是挺正常
进行查询报错
Could not find any factory for identifier ‘jdbc‘
提示对jdb找不到实现类进行处理。于是找了一下官方说明
解决
添加jdbc依赖到flink sql客户端 参照官网需要添加如下两个jar包
下载完成以后放入安装目录的lib包下
再次尝试,仍报错如下
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
再次尝试,仍报错如下
根据提示,查阅官方文档,发现connection—name' = 'test不在jdbc连接的选项中。那么为什么开发的sql可以那么写?这里有一个问题后面讨论。根据提示去除该选项,继续执行。
执行成功。
jdbc 选项(1.13.0)
| Option | Required | Default | Type | Description |
|---|---|---|---|---|
| connector | required | (none) | String | 指定使用的连接器,这里必须是 'jdbc'. |
| url | required | (none) | String | 链接URL |
| table-name | required | (none) | String | 需要连接的表名 |
| driver | optional | (none) | String | 使用的JDBC驱动实现类,如果未指明,则根据URL自动识别 |
| username | optional | (none) | String | 用户名,与密码必须同时设置 |
| password | optional | (none) | String | 密码 |
| connection.max-retry-timeout | optional | 60s | Duration | 最大重试间隔时间s |
| scan.partition.column | optional | (none) | String | 分区字段,详细请看 Partitioned Scan |
| scan.partition.num | optional | (none) | Integer | 分区个数 |
| scan.partition.lower-bound | optional | (none) | Integer | 最小分区值 |
| scan.partition.upper-bound | optional | (none) | Integer | 最大分区值 |
| scan.fetch-size | optional | 0 | Integer | 每次读取时应从数据库中提取的行数。如果指定的值为零,则忽略提示。 |
| scan.auto-commit | optional | true | Boolean | 在JDBC驱动程序上设置自动提交标志,该标志决定是否在事务中自动提交每个语句。一些JDBC驱动程序,特别是Postgres,可能需要将这个值设置为false,以便以流方式输出结果。 |
| lookup.cache.max-rows | optional | (none) | Integer | 缓存最大行数,超过行数则过期,详细请看Lookup Cache |
| lookup.cache.ttl | optional | (none) | Duration | 缓存最大时间,超过则过期,详细请看Lookup Cache |
| lookup.max-retries | optional | 3 | Integer | 更新缓存最大失败重试次数 |
| sink.buffer-flush.max-rows | optional | 100 | Integer | 最大flush前缓存池大小,设置为0则关闭 |
| sink.buffer-flush.interval | optional | 1s | Duration | 刷新间隔,在此期间,异步线程将刷新数据。可以设置为“0”以禁用它。注意,”sink.buffer-flush。Max-rows '可以设置为'0',并设置刷新间隔以允许对缓冲动作进行完全异步处理。 |
| sink.max-retries | optional | 3 | Integer | 最大写失败重试次数 |
| sink.parallelism | optional | (none) | Integer | 设置写操作并行度,默认情况下,会有系统自行决定。 |
以上是先行最新版本1.13所支持的所有选项。至于为什么会出现有选项在client中不支持,在平台却支持的情况。后续如果有解答,再行更新。关于选项的更深层次的内容,可以访问flink官方文档进行查阅。