首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >flink教程-详解flink 1.11 中的CDC (Change Data Capture)

flink教程-详解flink 1.11 中的CDC (Change Data Capture)

作者头像
大数据技术与应用实战
发布于 2020-09-15 06:20:05
发布于 2020-09-15 06:20:05
2.3K00
代码可运行
举报
运行总次数:0
代码可运行
  • CDC简介
  • Canal
  • CanalJson反序列化源码解析

CDC简介

CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等,

用户可以在以下的场景下使用CDC:

  • 使用flink sql进行数据同步,可以将数据从一个数据同步到其他的地方,比如mysql、elasticsearch等。
  • 可以在源数据库上实时的物化一个聚合视图
  • 因为只是增量同步,所以可以实时的低延迟的同步数据
  • 使用EventTime join 一个temporal表以便可以获取准确的结果

flink 1.11 将这些changelog提取并转化为table apa和sql,目前支持两种格式:Debezium和Canal,这就意味着源表不仅仅是append操作,而且还有upsert、delete操作。

image

Canal

接下来我们使用canal为例简单介绍下CDC的使用

canal 格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "data": [
    {
      "id": "13",
      "username": "13",
      "password": "6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9",
      "name": "Canal Manager V2"
    }
  ],
  "old": [
    {
      "id": "13",
      "username": "13",
      "password": "6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9",
      "name": "Canal Manager"
    }
  ],
  "database": "canal_manager",
  "es": 1568972368000,
  "id": 11,
  "isDdl": false,
  "mysqlType": {...},
  "pkNames": [
    "id"
  ],
  "sql": "",
  "sqlType": {...},
  "table": "canal_user",
  "ts": 1568972369005,
  "type": "UPDATE"
}

简单讲下几个核心的字段:

  • type : 描述操作的类型,包括‘UPDATE’, 'INSERT', 'DELETE'。
  • data : 代表操作的数据。如果为'INSERT',则表示行的内容;如果为'UPDATE',则表示行的更新后的状态;如果为'DELETE',则表示删除前的状态。
  • old :可选字段,如果存在,则表示更新之前的内容,如果不是update操作,则为 null。

完整的语义如下;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private String                    destination;                            // 对应canal的实例或者MQ的topic
    private String                    groupId;                                // 对应mq的group id
    private String                    database;                               // 数据库或schema
    private String                    table;                                  // 表名
    private List<String>              pkNames;
    private Boolean                   isDdl;
    private String                    type;                                   // 类型: INSERT UPDATE DELETE
    // binlog executeTime
    private Long                      es;                                     // 执行耗时
    // dml build timeStamp
    private Long                      ts;                                     // 同步时间
    private String                    sql;                                    // 执行的sql, dml sql为空
    private List<Map<String, Object>> data;                                   // 数据列表
    private List<Map<String, Object>> old;                                    // 旧数据列表, 用于update, size和data的size一一对应
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 定义的字段和data 里面的数据想匹配 
CREATE TABLE my_table (
  id BIGINT,
  name STRING,
  description STRING,
  weight DECIMAL(10, 2)
) WITH (
 'connector' = 'kafka',
 'topic' = 'products_binlog',
 'properties.bootstrap.servers' = 'localhost:9092',
 'properties.group.id' = 'testGroup',
 'canal-json.ignore-parse-errors'='true' -- 忽略解析错误,缺省值false
);

CanalJson反序列化源码解析

canal 格式也是作为一种flink的格式,而且是source,所以也就是涉及到读取数据的时候进行反序列化,我们接下来就简单看看CanalJson的反序列化的实现。具体的实现类是CanalJsonDeserializationSchema。

我们看下这个最核心的反序列化方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 @Override
 public void deserialize(byte[] message, Collector<RowData> out) throws IOException {
  try {
      //使用json反序列化器将message反序列化成RowData
   RowData row = jsonDeserializer.deserialize(message);
   
   //获取type字段,用于下面的判断
   String type = row.getString(2).toString();
   if (OP_INSERT.equals(type)) {
    // 如果操作类型是insert,则data数组表示的是要插入的数据,则循环遍历data,然后添加一个标识INSERT,构造RowData对象,发送下游。
    ArrayData data = row.getArray(0);
    for (int i = 0; i < data.size(); i++) {
     RowData insert = data.getRow(i, fieldCount);
     insert.setRowKind(RowKind.INSERT);
     out.collect(insert);
    }
   } else if (OP_UPDATE.equals(type)) {
    // 如果是update操作,从data字段里获取更新后的数据、
    ArrayData data = row.getArray(0);
    // old字段获取更新之前的数据
    ArrayData old = row.getArray(1);
    for (int i = 0; i < data.size(); i++) {
     // the underlying JSON deserialization schema always produce GenericRowData.
     GenericRowData after = (GenericRowData) data.getRow(i, fieldCount);
     GenericRowData before = (GenericRowData) old.getRow(i, fieldCount);
     for (int f = 0; f < fieldCount; f++) {
      if (before.isNullAt(f)) {
       //如果old字段非空,则说明进行了数据的更新,如果old字段是null,则说明更新前后数据一样,这个时候把before的数据也设置成after的,也就是发送给下游的before和after数据一样。
       before.setField(f, after.getField(f));
      }
     }
     before.setRowKind(RowKind.UPDATE_BEFORE);
     after.setRowKind(RowKind.UPDATE_AFTER);
     //把更新前后的数据都发送下游
     out.collect(before);
     out.collect(after);
    }
   } else if (OP_DELETE.equals(type)) {
    // 如果是删除操作,data字段里包含将要被删除的数据,把这些数据组织起来发送给下游
    ArrayData data = row.getArray(0);
    for (int i = 0; i < data.size(); i++) {
     RowData insert = data.getRow(i, fieldCount);
     insert.setRowKind(RowKind.DELETE);
     out.collect(insert);
    }
   } else {
    if (!ignoreParseErrors) {
     throw new IOException(format(
      "Unknown \"type\" value \"%s\". The Canal JSON message is '%s'", type, new String(message)));
    }
   }
  } catch (Throwable t) {
   // a big try catch to protect the processing.
   if (!ignoreParseErrors) {
    throw new IOException(format(
     "Corrupt Canal JSON message '%s'.", new String(message)), t);
   }
  }
 }

参考资料: [1].https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=147427289 [2].https://flink.apache.org/news/2020/07/06/release-1.11.0.html#table-apisql-support-for-change-data-capture-cdc

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据技术与应用实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入解读flink sql cdc的使用以及源码分析
CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等.
大数据技术与应用实战
2020/09/16
5.7K0
深入解读flink sql cdc的使用以及源码分析
Flink CDC 原理、实践和优化
CDC 是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库(Source)的增量变动记录,同步到一个或多个数据目的(Sink)。在同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。
KyleMeow
2021/03/15
26.4K0
Flink CDC 原理、实践和优化
《一文读懂腾讯云Flink CDC 原理、实践和优化》
CDC 变更数据捕获技术可以将源数据库的增量变动记录,同步到一个或多个数据目的。本文基于腾讯云 Oceanus 提供的 Flink CDC 引擎,着重介绍 Flink 在变更数据捕获技术中的应用。 一、CDC 是什么? CDC 是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库(Source)的增量变动记录,同步到一个或多个数据目的(Sink)。在同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。 例如对于电商平台,用户的订单
腾讯产业互联网学堂1
2023/05/29
3.5K0
《一文读懂腾讯云Flink CDC 原理、实践和优化》
Flink CDC 原理、实践和优化
CDC 是变更数据捕获(Change Data Capture)技术的缩写,它可以将源数据库(Source)的增量变动记录,同步到一个或多个数据目的(Sink)。在同步过程中,还可以对数据进行一定的处理,例如分组(GROUP BY)、多表的关联(JOIN)等。
腾讯云大数据
2021/03/31
5.3K0
Flink CDC 原理、实践和优化
Flink CDC 2.0 数据处理流程全面解析
8月份 FlinkCDC 发布2.0.0版本,相较于1.0版本,在全量读取阶段支持分布式读取、支持checkpoint,且在全量 + 增量读取的过程在不锁表的情况下保障数据一致性。
王知无-import_bigdata
2021/11/10
3.2K1
Flink CDC 2.0 数据处理流程全面解析
Flink cdc自定义format格式数据源
变更数据捕获 (CDC) 已成为一种流行的模式,用于从数据库捕获已提交的变更并将这些变更传播给下游消费者,例如保持多个数据存储同步并避免常见的陷阱,例如双重写入。 能够轻松地将这些变更日志摄取和解释到 Table API/SQL 中一直是 Flink 社区的一个非常需要的功能,现在 Flink 1.11 可以实现。
从大数据到人工智能
2022/01/18
1.8K0
Flink cdc自定义format格式数据源
基于 Flink SQL CDC 的实时数据同步方案
Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的数据同步方案,基于 Flink CDC 同步的解决方案以及更多的应用场景和 CDC 未来开发规划等方面进行介绍和演示。
Spark学习技巧
2020/11/09
3.9K0
基于 Flink SQL CDC 的实时数据同步方案
【万字长文】Flink cdc源码精讲(推荐收藏)
上面内容主要是以构建source所需要的参数为主,具体我们进入到DebeziumSourceFunction中看看具体实现
857技术社区
2022/05/17
5.6K0
【万字长文】Flink cdc源码精讲(推荐收藏)
Flink 实现 MySQL CDC 动态同步表结构
作者:陈少龙,腾讯 CSIG 高级工程师 使用 Flink CDC(Change Data Capture) 实现数据同步被越来越多的人接受。本文介绍了在数据同步过程中,如何将 Schema 的变化实时地从 MySQL 中同步到 Flink 程序中去。 背景 MySQL 存储的数据量大了之后往往会出现查询性能下降的问题,这时候通过 Flink SQL 里的 MySQL CDC Connector 将数据同步到其他数据存储是常见的一种处理方式。 例如 CDC 到 ES 实现数据检索,CDC 到 ClikHou
腾讯云大数据
2022/01/26
7.9K0
实战自定义Flink SQL Connector( Flink 1.11 & Redis)
Flink SQL之所以简洁易用而功能强大,其中一个重要因素就是其拥有丰富的Connector(连接器)组件。Connector是Flink与外部系统交互的载体,并分为负责读取的Source和负责写入的Sink两大类。不过,Flink SQL内置的Connector有可能无法cover实际业务中的种种需求,需要我们自行定制。好在社区已经提供了一套标准化、易于扩展的体系,用户只要按照规范面向接口编程,就能轻松打造自己的Connector。本文就在现有Bahir Flink项目的基础上逐步实现一个SQL化的Redis Connector。
小晨说数据
2022/03/10
3.7K0
实战自定义Flink SQL Connector( Flink 1.11 & Redis)
Flink社区 | Flink CDC 2.0 正式发布,核心改进详解
摘要:本文由社区志愿者陈政羽整理,内容来源自阿里巴巴高级开发工程师徐榜江 (雪尽) 7 月 10 日在北京站 Flink Meetup 分享的《详解 Flink-CDC》。深入讲解了最新发布的 Flink CDC 2.0.0 版本带来的核心特性,包括:全量数据的并发读取、checkpoint、无锁读取等重大改进。
大数据技术架构
2021/08/25
2.7K0
Flink社区 | Flink CDC 2.0 正式发布,核心改进详解
Flink系列 - 实时数仓之FlinkCDC实现动态分流实战
自从Flink出了FlinkCDC之后,我们对数据库日志的采集就变得方便了许多了,除去了MaxWell、Cannel、OGG等第三方组件的繁琐配置,目前实现CDC有两种方式:HQL实现 和 DataStreamAPI实现(推荐)。
数据仓库践行者
2021/12/06
3.1K1
Flink系列 - 实时数仓之FlinkCDC实现动态分流实战
Flink CDC 新一代数据集成框架
主要讲解了技术原理,入门与生产实践,主要功能:全增量一体化数据集成、实时数据入库入仓、最详细的教程。Flink CDC 是Apache Flink的一个重要组件,主要使用了CDC技术从各种数据库中获取变更流并接入到Flink中,Apache Flink作为一款非常优秀的流处理引擎,其SQL API又提供了强大的流式计算能力,因此结合Flink CDC能带来非常广阔的应用场景。例如,Flink CDC可以代替传统的Data X和Canal工具作为实时数据同步,将数据库的全量和增量数据同步到消息队列和数据仓库中。也可以做实时数据集成,将数据库数据实时入湖入仓。还可以做实时物化视图,通过SQL对数据做实时的关联、打宽、聚合,并将物化结果写入到数据湖仓中。
小马哥学JAVA
2022/12/15
3.3K0
Flink CDC 新一代数据集成框架
Flink新增特性 | CDC(Change Data Capture) 原理和实践应用
CDC,Change Data Capture,变更数据获取的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等。
王知无-import_bigdata
2020/12/08
4K0
Flink新增特性 | CDC(Change Data Capture) 原理和实践应用
如何利用 Flink CDC 实现数据增量备份到 Clickhouse
首先什么是CDC ?它是Change Data Capture的缩写,即变更数据捕捉的简称,使用CDC我们可以从数据库中获取已提交的更改并将这些更改发送到下游,供下游使用。这些变更可以包括INSERT,DELETE,UPDATE等操作。
麒思妙想
2021/07/19
4.7K0
[重磅]Flink CDC之Yaml最佳实践之踩坑日记
继上篇文章提到了如何在应用层来通过编写yaml文件远程提交到flink集群来跑文章之后,作者开始重点研究了下目前已经支持的Flink CDC的yaml pipeline 形式的内容 source&sink。
睡前大数据
2025/03/31
4882
[重磅]Flink CDC之Yaml最佳实践之踩坑日记
Flink CDC 和 kafka 进行多源合并和下游同步更新
摘要:本文介绍了 Flink CDC 利用 Kafka 进行 CDC 多源合并和下游同步更新的实践分享。内容包括:
文末丶
2022/02/10
3.3K0
Flink CDC 和 kafka 进行多源合并和下游同步更新
基于流计算 Oceanus Flink CDC 做好数据集成场景
数据时代,企业对技术创新和服务水准的要求不断提高,数据已成为企业极其重要的资产。无论是在在企业数据中台的建设,亦或者是打造一站式数据开发和数据治理的PASS平台。 首先需要做的就是进行跨应用的数据融合计算,需要将数据从孤立的数据源中采集出来,汇集到可被计算平台高效访问的目的地。此过程称之为ETL。通常所说的同步大致分为离线全量ETL、离线增量+离线全量的ETL、实时增量+离线全量ETL、实时增量ETL4种方式。 数据同步成为企业数据开发和使用一个绕不过去的技术需求。业内也存在大量的开源的解决方案。 在数据集成技术选型中,我们需要考虑的因素有哪些?主流开源方案中各自的优缺点有哪些?目前备受瞩目和推崇 Flink CDC ETL 是否能作为线上主力同步工具之一,它的优势有哪些?原理是什么?本文主要围绕以上几个疑问,进行论述。
Andy_l
2021/12/22
1.7K1
基于流计算 Oceanus Flink CDC 做好数据集成场景
Flink CDC 新一代数据集成框架
主要讲解了技术原理,入门与生产实践,主要功能:全增量一体化数据集成、实时数据入库入仓、最详细的教程。Flink CDC 是Apache Flink的一个重要组件,主要使用了CDC技术从各种数据库中获取变更流并接入到Flink中,Apache Flink作为一款非常优秀的流处理引擎,其SQL API又提供了强大的流式计算能力,因此结合Flink CDC能带来非常广阔的应用场景。例如,Flink CDC可以代替传统的Data X和Canal工具作为实时数据同步,将数据库的全量和增量数据同步到消息队列和数据仓库中。也可以做实时数据集成,将数据库数据实时入湖入仓。还可以做实时物化视图,通过SQL对数据做实时的关联、打宽、聚合,并将物化结果写入到数据湖仓中。
小马哥学JAVA
2022/11/24
1.5K0
【BUG】Flink CDC 2.0.0迷之异常!!!
一、场景还原 基于 Flink CDC 的 SQL Api 实现实时监听 MySQL 的 binlog 数据发送到 Kafka 二、框架版本 框架 版本 Flink 1.13.2 MySQL 5.7.25 connector-mysql-cdc 2.0.0 三、测试代码 public class CDCWithSqlTest { public static void main(String[] args) { StreamExecutionEnvironment env
857技术社区
2022/05/17
2.3K0
推荐阅读
相关推荐
深入解读flink sql cdc的使用以及源码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验