整理:陈政羽(Flink 社区志愿者)

摘要:Flink 1.11 引入了 CDC,在此基础上, JDBC Connector 也发生比较大的变化,本文由 Apache Flink Contributor,阿里巴巴高级开发工程师徐榜江(雪尽)分享,主要介绍 Flink 1.11 JDBC Connector 的最佳实践。大纲如下:

JDBC connector

JDBC Catalog

JDBC Dialect

Demo

Tips:点击下方链接可查看作者原版 PPT 及分享视频:

https://flink-learning.org.cn/developers/flink-training-course3/

JDBC-Connector 的重构

JDBC Connector 在 Flink 1.11 版本发生了比较大的变化,我们先从以下几个 Feature 来具体了解一下 Flink 社区在这个版本上对 JDBC 所做的改进。

FLINK-15782 :Rework JDBC Sinks[1] (重写 JDBC Sink)

这个 issue 主要为 DataStream API 新增了 JdbcSink,对于使用 DataStream 编程的用户会更加方便地把数据写入到 JDBC;并且规范了一些命名规则,以前命名使用的是 JDBC 加上连接器名称,目前命名规范为 Jdbc+ 连接器名称

FLINK-17537:Refactor flink-jdbc connector structure[2] (重构 flink-jdbc 连接器的结构)

这个 issue 将 flink-jdbc 包名重命名为 flink-connector-jdbc,与 Flink 的其他 connector 统一,将所有接口和类从 org.apache.flink.java.io.jdbc(旧包)规范为新包路径 org.apache.flink.connector.jdbc(新包),通过这种重命名用户在对底层源代码的阅读上面会更加容易的理解和统一。

FLIP-95: New TableSource and TableSink interfaces[3] (新的 TableSource 和 TableSink 接口)

由于早期数据类型系统并不是很完善,导致了比较多的 Connector 在使用上会经常报数据类型相关的异常,例如 DECIMAL 精度类型,在以往的 Flink 1.10 版本中有可能出现下图问题:

基于 FLIP-95 新的 TableSource 和 TableSink 在精度支持方面做了重构,目前数据精度方面的支持已经很完善了。

FLIP-122:New Connector Property Keys for New Factory[4](新的连接器参数)

在 Flink 1.11 版本中,我们对 DDL 的 WITH 参数相对于 1.10 版本做了简化,从用户视角看上就是简化和规范了参数,如表格所示:

Old Key (Flink 1.10)

New Key (Flink 1.11)

connector.type

connector.type

connector.url

url

connector.table

table-name

connector.driver

driver

connector.username

username

connector.password

password

connector.read.partition.column

scan.partition.column

connector.read.partition.num

scan.partition.num

connector.read.partition.lower-bound

scan.partition.lower-bound

connector.read.partition.upper-bound

scan.partition.upper-bound

connector.read.fetch-size

scan.fetch-size

connector.lookup.cache.max-rows

lookup.cache.max-rows

connector.lookup.cache.ttl

lookup.cache.ttl

connector.lookup.max-retries

lookup.max-retries

connector.write.flush.max-rows

sink.buffer-flush.max-rows

connector.write.flush.interval

sink.buffer-flush.interval

connector.write.max-retries

sink.max-retries

大家可以看到表格中有 3 个标红的地方,这个是相对于 1.10 有发生变化比较多的地方。这次 FLIP 希望进一步简化连接器属性,以便使属性更加简洁和可读,并更好地与 FLIP-107 协作。如果需要了解更多的 Connector 参数可以进一步参考官方文档和 FLIP-122 中提到的改变,这样有助于从旧版本迁移到新版本并了解参数的变化。

FLIP-87:Primary key Constraints in Table API[5] (Table API 接口中的主键约束问题)

Flink 1.10 存在某些 Query 无法推断出主键导致无法进行 Upsert 更新操作(如下图所示错误)。所以在 FLIP-87 中为 Flink SQL 引入的 Primary Key 约束。Flink 的主键约束遵循 SQL 标准,主键约束分为 PRIMARY KEY NOT ENFORCED 和 PRIMARY KEY ENFORCED, ENFORCED 表示是否对数据进行校验。我们常见数据库的主键约束属于 PRIMARY KEY ENFORCED,会对数据进行校验。因为 Flink 并不持有数据,因此 Flink 支持的主键模式是 PRIMARY KEY NOT ENFORCED,  这意味着 Flink 不会校验数据,而是由用户确保主键的完整性。例如 HBase 里面对应的主键应该是 RowKey,在 MySQL 中对应的主键是在用户数据库的表中对应的主键。

JDBC Catalog

目前 Flink 支持 Catalog 主要有 JDBC Catalog 和 Hive Catalog 。在关系数据库中的表,如果要在 Flink 中使用,用户需要手动写表的 DDL,一旦表的 Schema 发生改变,用户需要手动修改, 这是比较繁琐的事情。JDBC Catalog 提供了接口用于连接到各种关系型数据库,使得 Flink 能够自动检索表,不用用户手动输入和修改。目前 JDBC Catalog 内置目前实现了 Postgres Catalog。Postgres catalog 是一个 read-only (只读)的 Catalog,只支持读取 Postgres 表,支持的功能比较有限。下面代码展示了目前 Postgres catalog 支持的 6 个功能:数据库是否存在、数据库列表、获取数据库、根据数据库名获取表列表、获得表、表是否存在。

// The supported methods by Postgres Catalog.PostgresCatalog.databaseExists(String databaseName)PostgresCatalog.listDatabases()PostgresCatalog.getDatabase(String databaseName)PostgresCatalog.listTables(String databaseName)PostgresCatalog.getTable(ObjectPath tablePath)PostgresCatalog.tableExists(ObjectPath tablePath)

如果需要支持其他 DB (如 MySQL),需要用户根据 FLIP-93 的 JdbcCatalog 接口实现对应不同的 JDBC Catalog。

JDBC Dialect

什么是 Dialect?

Dialect (方言)对各个数据库来说,Dialect 体现各个数据库的特性,比如语法、数据类型等。如果需要查看详细的差异,可以点击这里[6]查看详细差异。下面通过对比 MySQL 和 Postgres 的一些常见场景举例:

Dialect

MySQL

Postgres

场景描述

Grammar(语法)

LIMIT 0,30

WITH LIMIT 30 OFFSET 0

分页

Data Type (数据类型)

BINARY

BYTEA,ARRAY

字段类型

Command (命令)

show tables

dt

查看所有表

在数据类型上面,Flink SQL 的数据类型目前映射规则如下:

MySQL type

PostgreSQL type

Flink SQL type

TINYINT

TINYINT

SMALLINT

TINYINT UNSIGNED

SMALLINT

INT2

SMALLSERIAL

SERIAL2

SMALLINT

INT

MEDIUMINT

SMALLINT

UNSIGNED

INTEGER

SERIAL

INT

BIGINT

INT

UNSIGNED

BIGINT

BIGSERIAL

BIGINT

BIGINT

评论留言

还没有评论留言,赶紧来抢楼吧~~

吐槽小黑屋()

* 这里是“吐槽小黑屋”,所有人可看,只保留当天信息。

Erlo.vip2021-02-06 19:01:47Hello、欢迎使用吐槽小黑屋,这就是个吐槽的地方。

回车键发送

当前在线 17 人 源码约 75909篇

返回顶部

给这篇文章打个标签吧~

棒极了

糟糕透顶

好文章

PHP

JAVA

JS

小程序

Python

SEO

MySql

确认

flink mysql connector_Flink JDBC Connector:Flink 与数据库集成最佳实践相关推荐

  1. Flink JDBC Connector:Flink 与数据库集成最佳实践

    整理:陈政羽(Flink 社区志愿者) 摘要:Flink 1.11 引入了 CDC,在此基础上, JDBC Connector 也发生比较大的变化,本文由 Apache Flink Contribut ...

  2. flink+mysql+connector_Flink SQL中connector的定义和实现

    在FLink SQL中一般是以create Table和connector结合的形式读取外部数据,从而创建table,如下是以JDBC作为connector的创建格式: CREATE TABLE My ...

  3. Flink 与 TiDB 联合发布实时数仓最佳实践白皮书

    简介:点击链接,动动手指获取白皮书-另外,实时数仓 Meetup 议题征集中! GitHub 地址 https://github.com/apache/flink 欢迎大家给 Flink 点赞送 st ...

  4. MySQL性能优化、故障排查及最佳实践秘籍,阿里云数据库专家玄惭的“武功”全记录...

    为什么80%的码农都做不了架构师?>>>    文章简介 玄惭,真名罗龙九,阿里云DBA专家,负责阿里云RDS线上稳定以及专家服务团队.他经历过阿里历年双11实战考验,积累了7年对阿 ...

  5. mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践

    Spring Data Jpa 虽然可以使用参数调整批量插入,但是仅限于主键策略不是 IDENTITY 的情况下,对于习惯了使用 IDENTITY 的 MySQL 选手来说,批量插入数据直接就悲剧了. ...

  6. 干货丨金仓JDBC读写分离介绍和最佳实践

    背景和目的 当前业务系统面临的业务压力越来越大,单节点已经难以满足现在和未来的业务需求.因此市面上出现了很多的解决方案,其中就包括读写分离集群.读写分离通过备机读负载均衡,降低主机上读负载,以此提高整 ...

  7. mysql 存储uuid_MySQL中存储UUID的最佳实践

    在 MySQL 中有一个UUID () 函数, 通常用UUID做唯一标识,需要在 数据库 中进行存储. 使用此函数可以让MySQL生成一个UUID值,并以VARCHAR(36)类型的可读形式返回.如图 ...

  8. Flink SQL 1.11 新功能与最佳实践

    #2020云栖大会#阿里云海量offer来啦!投简历.赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>> 整理者:陈婧敏(清樾) 本文整理自 Apache Flink PMC,阿 ...

  9. Flink SQL 如何避免 JDBC Connector 维表出现 Finished 状态

    背景 JDBC Connector 使得关系型数据库( Mysql.PostgreSQL)可以作为 Flink 主流的维表,如下图: 但如果使用不当会出现 JDBC Connector Source ...

最新文章

  1. C++矩阵处理工具——Eigen
  2. 个人博客系统的设计与实现_一个 Go 开发的快速、简洁、美观、前后端分离的个人博客系统...
  3. [转]多级配方处理的简洁方式
  4. moviepy报错之 .This error can be due to the fact that ImageMagick is not installed on your computer(亲测)
  5. 【深度好文】过了30岁,做技术开发、工程师还有前途吗?
  6. innerHTML、innerText和outerHTML、outerText的区别
  7. EfficientNetV2:训练速度快了5~10x,更小,更快,精度更高的EfficientNet
  8. Q137:PBRT-V3,各种采样(Sampling)之间的逻辑
  9. MIPS处理器 CPU数据通路
  10. PhotoShop中合并形状颜色会变化的问题
  11. CF755F PolandBalls and Gifts
  12. YouTuBe油管/头条点赞订阅关注分享提示PR模板Mogrt
  13. 神经网络学习笔记(一):全连接层的作用是什么?
  14. IP和MNC地址协议
  15. css3,background-clip/background-origin的使用场景,通俗讲解
  16. 记录一下git 打patch导入patch遇到的问题
  17. VUE组件通信的使用
  18. 程序员修炼之道读后感(一)
  19. 美国计算机科学硕士的学制,美国CS专业你知道多少?
  20. np.histogram()直方图分布

热门文章

  1. Python之format格式化输出
  2. 3.1.7 基本地址变换机构
  3. 多线程终极模式:生产者-消费者模式
  4. Nginx的正向代理与反向代理
  5. android如何使用ios14组件,ios14小组件怎么添加 苹果ios14小组件添加使用教程
  6. python消息队列celery_消息队列(kafka/nsq等)与任务队列(celery/ytask等)到底有什么不同?...
  7. ifix从sqlserver里读数据_ifix连接SQL和读写EXCEL的方法
  8. nmon结果分析工具_Nmon实时监控并生成HTML监控报告
  9. 求求你不要手写redis 缓存set,get
  10. Android真机调试打印日志的方法