JDBC 连接器允许使用 JDBC 驱动向任意类型的关系型数据库读取或者写入数据。 如果在 DDL 中定义了主键,JDBC sink 将以 upsert 模式与外部系统交换 UPDATE/DELETE 消息;否则,它将以 append 模式与外部系统交换消息且不支持消费 UPDATE/DELETE 消息。 Create SQL -- 在 Flink SQL 中注册一张 MySQL 表 'users'CREA...
之前jdbc connector 和 flink主代码放到了一起,自flink 1.15起,单独拆分了出来。因此,需要单独克隆一份代码。 git clone https://github.com/apache/flink-connector-jdbc.git 入口分析 类关系 flink的connector都是通过spi注入的,可以直接目录src/main/resources/META-INF/services下文件。 类 public class JdbcDynam...
控制刷写触发的最大数量 'connector.write.flush.max-rows' = '5000' 控制定时刷写的时间 'connector.write.flush.interval' = '2s' 两个条件先到先触发,这两个参数都是可以通过with()属性配置的。 JDBCUpsertFunction其实很简单,主要的工作就是包装对应的Format,执行它的open和invoke方法。其中open负责开启连接...
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(新包),通过这种重...
总结:JDBC sink的操作时,如果外部系统定义的DDL存在主键,则JDBC连接器将使用upsert语义而不是简单的insert,在Flink任务执行中如果出现了故障,Flink作业将会从上一个成功的检查点恢复并重新处理,这可能导致在恢复期间重新处理消息。 强烈建议使用upsert模式,因为使用append模式需要重新处理记录,下游可能会出现重复数据。
JDBC connector的入口JdbcDynamicTableFactory,提供了source和sink的支持。 Source 在Factory类中通过createDynamicTableSource来创建JdbcDynamicTableSource,并将需要的所有参数传递过去。jdbc作为source有两种用途:1.数据源使用Scan 2.维表关联使用Lookup。 Scan 通过JdbcRowDataInputFormat来实现数据读取,同时支持了列裁剪,lim...
然而,Flink并不直接支持只使用UPDATE而忽略UPSERT的操作。 对于你的需求“下游存在该数据就更新,不存在就不操作”,这实际上就是Upsert操作的基本行为。具体到Flink中,可以通过JDBC connector中的插入更新(Upsert)模式来实现。 需要注意的是,Flink的Upsert操作依赖于业务主键提供INSERT、UPDATE和DELETE全部三类变更。也就是...
如果定义了主键,JDBC 写入时是能够保证 Upsert 语义的, 如果 DB 不支持 Upsert 语法,则会退化成 DELETE + INSERT 语义。Upsert query 是原子执行的,可以保证幂等性。这个在官方文档中也详细描述了更新失败或者存在故障时候如何做出的处理,下面的表格是不同的 DB 对应不同的 Upsert 语法: ...
我们在官网上发现对于 JDBC Sink Connector 的幂等性中有如下解释:如果定义了主键,JDBC 写入时是能够保证 Upsert 语义的, 如果 DB 不支持 Upsert 语法,则会退化成 DELETE + INSERT 语义。Upsert query 是原子执行的,可以保证幂等性。这个在官方文档中也详细描述了更新失败或者存在故障时候如何做出的处理,下面的...
综合以上对Flink jdbc Connector的分析, 1. 根据不同类型数据库,用具体数据库的SQL方言实现幂等方案 2. 在持久化DML到远端数据库过程中有任何异常,在符合设定阈值情况下立即抛出RuntimeException结束掉当前线程 那么为什么要有2.呢? 一旦持久化数据到远端数据库发生异常,如果我们不结束掉当前线程,那么checkpoint就会顺利...