手把手构建基于 GBase8s 的 Flink connector

简介

本篇文章,首先会向大家阐述什么是 Flink connector 和 CDC , 然后会通过手把手的方式和大家一起构建一个简单的GBase8s的Flink connector,并完成实践项目,即通过Mysql CDC实时通过connector同步数据到GBase8s中。

什么是 Flink connector

Flink内置了一些基本数据源和接收器,这些数据源和接收器始终可用。该预定义的数据源包括文件、Mysql、RabbitMq、Kafka、ES等,同时也支持数据输出到文件、Mysql、RabbitMq、Kafka、ES等。

简单的说:flink连接器就是将某些数据源加载与数据输出做了封装(连接器),我们只要引入对应的连接器依赖,即可快速的完成对数据源的加载以及数据的输出。

什么是CDC(Change Data Capture)

首先什么是CDC ?它是Change Data Capture的缩写,即变更数据捕捉的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等操作。

其主要的应用场景:

  • 异构数据库之间的数据同步或备份 / 建立数据分析计算平台

  • 微服务之间共享数据状态

  • 更新缓存 / CQRS 的 Query 视图更新

CDC 它是一个比较广义的概念,只要能捕获变更的数据,我们都可以称为 CDC 。业界主要有基于查询的 CDC 和基于日志的 CDC ,可以从下面表格对比他们功能和差异点。

基于查询的 CDC 基于日志的 CDC
概念 每次捕获变更发起 Select 查询进行全表扫描,过滤出查询之间变更的数据 读取数据存储系统的 log ,例如 MySQL 里面的 binlog持续监控
开源产品 Sqoop, Kafka JDBC Source Canal, Maxwell, Debezium
执行模式 Batch Streaming
捕获所有数据的变化
低延迟,不增加数据库负载
不侵入业务(LastUpdated字段)
捕获删除事件和旧记录的状态
捕获旧记录的状态

flink-connector-gbasedbt

我们其实是可以自己手写Sink将CDC的数据直接汇入我们的目标数据库的。这样是不是不够优雅?我们是不是可以通过Flink SQL的方式将数据汇入到GBase8s呢?答案是肯定的,接下来我们就来实现一个简单的GBase8s的Flink connector

  1. 构建 行转换器(RowConverter)

  2. 构建 方言(Dialect)

  3. 注册动态表工厂(DynamicTableFactory),以及相关Sink程序

经过上面三步,就可以实现一个简单的connector了。接下来我们就来看,如何实现:

构建 行转换器(RowConverter)

package wang.datahub.converter;

import org.apache.flink.connector.jdbc.internal.converter.AbstractJdbcRowConverter;
import org.apache.flink.table.types.logical.RowType;

/**
* @author lijiaqi
*/
public class GBasedbtRowConverter extends AbstractJdbcRowConverter {

   public GBasedbtRowConverter(RowType rowType) {
       super(rowType);
  }

   private static final long serialVersionUID = 1L;

   @Override
   public String converterName() {
       return "gbasedbt";
  }

}

构建 方言(Dialect)

package wang.datahub.dialect;

import org.apache.flink.connector.jdbc.dialect.JdbcDialect;
import org.apache.flink.connector.jdbc.internal.converter.JdbcRowConverter;
import org.apache.flink.table.api.TableSchema;
import org.apache.flink.table.api.ValidationException;
import org.apache.flink.table.types.logical.RowType;
import wang.datahub.converter.GBasedbtRowConverter;

import java.util.Optional;

/**
*
* @author lijiaqi
*/
public class GBasedbtDialect implements JdbcDialect {

   private static final long serialVersionUID = 1L;

   @Override
   public String dialectName() {
       return "gbasedbt";
  }

   @Override
   public boolean canHandle(String url) {
       return url.startsWith("jdbc:gbasedbt-sqli:");
  }

   @Override
   public JdbcRowConverter getRowConverter(RowType rowType) {
       return new GBasedbtRowConverter(rowType);
  }

   @Override
   public String getLimitClause(long l) {
       return null;
  }

   @Override
   public void validate(TableSchema schema) throws ValidationException {
       JdbcDialect.super.validate(schema);
  }

   @Override
   public Optional<String> defaultDriverName() {
       return Optional.of("com.gbasedbt.jdbc.Driver");
  }

   @Override
   public String quoteIdentifier(String identifier) {
       return "'" + identifier + "'";
  }

   @Override
   public Optional<String> getUpsertStatement(String tableName, String[] fieldNames, String[] uniqueKeyFields) {
       return JdbcDialect.super.getUpsertStatement(tableName, fieldNames, uniqueKeyFields);
  }

   @Override
   public String getRowExistsStatement(String tableName, String[] conditionFields) {
       return JdbcDialect.super.getRowExistsStatement(tableName, conditionFields);
  }

   @Override
   public String getInsertIntoStatement(String tableName, String[] fieldNames) {
       return JdbcDialect.super.getInsertIntoStatement(tableName, fieldNames);
  }

   @Override
   public String getUpdateStatement(String tableName, String[] fieldNames, String[] conditionFields) {
       return JdbcDialect.super.getUpdateStatement(tableName, fieldNames, conditionFields);
  }

   @Override
   public String getDeleteStatement(String tableName, String[] condi
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麒思妙想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值