当前位置: 首页 > news >正文

Flink CDC YAML:面向数据集成的 API 设计

本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江(雪尽)老师在 Flink Forward Asia 2024 数据集成(一)专场中的分享。主要分为以下四个方面:

  1. Flink CDC 

  2. YAML API

  3. Transform + AI

  4. Community

01

Flink CDC 

1.1 Flink CDC

c94ee3061f3354d8f9128bf6c9769abd.jpeg

Flink CDC 基于数据库日志中变化记录捕获技术,能够实现全量与增量数据的一体化读取,并提供了端到端的流式数据集成框架。通过与 Flink 框架结合,CDC 不仅展现出强大的数据管道处理能力,还能充分利用上下游丰富的生态系统,从而高效地完成海量数据的实时集成任务。在升级至 3.0 版本后,Flink CDC 的功能得到了进一步扩展:它不再仅仅作为数据源(Source),而是同时提供了写入下游端(Sink)的能力,使得从源头到目的地的数据集成过程变得更加流畅且可控。以 MySQL 为例,Flink CDC 提供的核心连接器均支持全量和增量数据的一体化处理,在整个同步过程中自动从全量切换到增量模式,并且确保数据传输的实时性和精确一次语义。

1.2 Flink CDC 用户 API

98630e9ef2dae10f9c794a8ac904b66b.jpeg

从3.0版本开始,用户现在可以使用三种 API 来编写作业:CDC YAML API、Flink SQL API 和 Flink DataStream API。这三种 API 各有特点,适用于不同的场景,CDC YAML API 是目前最被推荐的选择。

  • CDC YAML API : 特别适合那些希望以更直观且易于维护的方式定义其数据处理逻辑的用户。它支持多种高级特性,如自动化的 Schema Evolution(表结构变更)、分库分表同步、行过滤、列投影转换(Transform)等。通过 YAML API 实现这些功能不仅简单直接,而且能够极大简化开发流程。对于需要频繁调整表结构或执行复杂的数据迁移任务来说,YAML API 提供了极大的便利性。

  • Flink SQL API : 允许用户利用类似标准 SQL 的语法进行数据查询与转换操作,非常适合熟悉 SQL 语言的专业人士。虽然在特定领域内表现优秀,但当涉及到较为复杂的业务逻辑(如表结构变更演化)时可能不够灵活。

  • Flink DataStream API : 基于 Java 语言的 DataStream API 为开发者提供了最大的灵活性,几乎可以实现所有类型的需求。然而,这也意味着它的学习曲线相对陡峭,特别是对于初学者而言的理解门槛较高。

1.3 传统 CDC 数据集成作业

47d7aa842e9cda45d9da330c58bf4584.jpeg

在讨论 Flink CDC 的优势之前,我们先回顾一下传统 CDC(变更数据捕获)的数据集成方案。尽管这种架构较为传统,但目前仍被众多企业所采用。这类做法是将全量数据同步和增量数据同步分开处理:全量同步基于 DataX 或 Sqoop 完成,而增量同步则使用 Debezium 或 Canal 等组件来实现。系统中会同时存在两张表——一个用于存储全量数据,另一个用于存放增量更新的信息;两表由调度系统定时进行合并,方可得到完整的结果表。

这种方法的缺点在于整个流程较长且涉及多个组件,这不仅增加了系统的复杂性,也对维护提出了更高的要求。此外,由于定时任务无法保证事务级别的数据一致性,因此难以确保每次合并后的数据都是符合数据库一致性语义的。

此外,上述链路难以满足对高时效性场景的需求。即使是极限配置下的调度策略,其更新频率也很难低于5分钟一次;若试图进一步缩短时间间隔至秒级,则很可能导致链路负荷过高,进而崩溃。

1.4 基于 Flink CDC 的数据集成作业

7b907038ed57db50888a1b5ef124c019.jpeg

相比之下,基于 Flink CDC 的数据集成作业可以显著简化上述流程。在已有 Flink 集群的前提下,开发人员仅需编写一个 Flink 作业即可完成全量与增量一体化的数据同步任务。整个过程中,Flink 框架能够确保精确一次(Exactly-once)的事件处理语义,即保证同步的数据记录既不会丢失也不会重复。此外,作为一款专为实时计算设计的流处理框架,Flink 具备提供端到端亚秒级延迟的能力,非常适合对时效性要求高的应用场景。

特别是随着 YAML API 的引入,现在可以通过简单的 YAML 配置文件来定义从源到目的地的数据集成过程,无需再手动寻找和配置各种连接器,使得创建端到端的数据集成解决方案变得更加便利。

1.5 Flink CDC 的优势

e5b1c8c25fa6dc556fbb343487738c85.jpeg

Flink CDC 的架构优势在于其提供了一个端到端的数据流水线(Data Pipeline)。用户仅需编写一个 YAML 文件来定义整个数据流水线的处理逻辑,同时,它还配备了工具支持,使得现有的命令可以直接将 YAML 描述的数据流水线转换为 Flink 作业运行起来。这大大简化了配置和启动流程。

在过去的一年里,社区在“细粒度 Schema Evolution”(表结构变更同步)方面做了大量工作。这项功能允许更灵活地应对数据库模式变化的情况,包括但不限于容错机制、容错级别以及进化策略的支持等。这些改进使得 Flink CDC 能够更好地适应不同业务场景下的具体需求。

此外,ETL(抽取-转换-加载)过程中的“转换”(Transform)环节对于数据集成至关重要。Flink CDC 在此环节提供了强大的类 SQL 表达能力,支持对部分列进行投影、根据表达式追加计算列、按条件过滤数据行等功能,并且支持表达式嵌套及用户自定义函数(UDF)等。这样的设计极大地提升了基于 Flink CDC 的数据集成任务的效率与灵活性。值得注意的是,Flink CDC 作为早期就致力于实现全增量一体化解决方案的技术之一,不仅能够处理实时变化的数据捕获问题,同时也兼顾了历史数据的批量导入,从而为企业级应用提供了更加全面的数据同步方案。

02

YAML API

2.1 Flink CDC 发展历史

945e091681b32bfb907213553be65302.jpeg

Flink CDC 自 2020 年发布首个版本以来,基本保持着一到两年一个大版本,每个大版本分为四到五个小版本的稳定演进。继 2.0 版本实现增量快照算法、3.0 版本提出 YAML 端到端数据集成框架之后,Flink CDC 在 2024 年一月成功作为 Apache Flink 的子项目捐赠到 ASF 基金会。

2.2 Flink CDC 1.x:早期版本的 Flink CDC 连接器

a39e6db3d8e81c19fdb8020c7b97dc54.jpeg

Flink CDC 1.x 系列版本最早于 2020 年发布并开源,它是基于 Flink Source API 实现的一组连接器,可以作为数据源使用,提供了捕获 MySQL 和 PostgreSQL 表中变化数据的能力。然而早期版本实现中,全量捕获转增量捕获的过程需要锁表,由于快照阶段耗时较长,这一过程会对生产业务造成巨大影响,可以认为在生产上基本不可用。(即便如此,当时也积累了一批用户)

2.3 Flink CDC 2.x:生产大规模可用的 CDC 连接器

a5ab1731322fd7601f3da024393d3233.jpeg

Flink CDC 2.x 系列版本实现了社区原创的“增量快照算法”,能够并行执行数据表快照,并实现全增量阶段的无锁切换,得到了阿里及其他云厂商公司在生产上大规模的验证及使用。增量快照算法的核心思路是将每张表按照主键列进行分块(Chunk)后由多个节点进行分布式读取,并通过水位线填充算法保证数据一致性,既不锁表也能提供精确一次语义。此外,此版本还增加了对 Db2、MongoDB、OceanBase 等数据库的支持。

2.4 Flink CDC 1.x & 2.x:简化 Flink ETL 作业

6006ef3f167aaf43bdea580111968a97.jpeg

Flink CDC 的 1.x 和 2.x 版本都只是一组支持了 CDC 的 Source 连接器,只能作为 Flink ETL 作业的一部分使用,即从事务型数据库中实时取出数据。这意味着作为一个数据源连接器,只能由用户选择已有的、基于 DataStream 或 SQL API 的 Sink 连接器搭配使用,没有提供完整的、端到端的体验。此外,由于 Flink CDC Source 连接器需要与所有其他符合标准的 Sink 连接器搭配使用,无法简单地加入自定义扩展,因此用户最期望的表结构变更同步、数据库 Binlog 写入 Kafka 等等功能,2.x 都不支持。

2.5 Flink CDC 3.x :端到端实时数据集成框架

e977d5f154c36d05dc8fabcd68067ac7.jpeg

在上述背景下,我们在社区推出了 Flink CDC 3.x 版本,提供了一个面向端到端的实时数据集成框架。它提供完整的数据集成体验,不仅提供了 Source 连接器,还提供了写入外部系统的 Sink 连接器。它能够识别源表的表结构变更,并通过特殊的事件报告给下游;能够正确处理上游动态加表、删除表等事件;此外,很重要的一点是版权归属问题。早期版本的 Flink CDC 在阿里巴巴组织下开源,可能导致社区中立性的疑虑。这些疑虑在捐赠给 Apache 基金会后得到了解决。

2.6 YAML API 设计

4e0663f2bbc9314b4e4b0312dfab2ed6.jpeg

在设计 YAML API 时,我们主要从两个方面进行了考量:一是面向的目标用户,一是 API 的设计原则。用户的需求是很简单的,MySQL 的数据要写到湖里、写到仓里。目标用户当然不需要是 Flink 的专家,这些初级用户正是 YAML API 的潜在用户。API 的设计原则是:足够简单,足够强大。这些是设计 YAML API 的时候个人的考量。

73a6a3ec8db04f66e959c42140843028.jpeg

最终推出的 API 也经过了很多方案的比较和选择,当时社区的设计稿讨论到了第五版,大家也对业界的数据集成框架、以及它们采用的 DSL 语言做了很多调研,最终选择基于 YAML。YAML 被广泛接受的原因之一是它的使用门槛比较低,可以理解它是若干个具有层级关系的 KV Pair 组成的文本文件,能够清晰地描述数据集成的逻辑,通过文本就能描述复杂的数据集成的 Flink 作业。

为了进一步简化体验,社区还提供了一个 CLI 命令行工具,可以让用户编写一个 YAML 文本,执行一条 shell 命令,就能生成一个 Flink CDC 作业。

2.7 Flink CDC 架构

87d49180a26434306fa6691b926870a4.jpeg

在加入 YAML API 后,Flink CDC 整体的架构如图所示。大家发现我特地标了不同的颜色,方便对三种 API 做详细的对比,包括 DataStream API,SQL API 还有 YAML API。DataStream 和 SQL API 下层都只有 CDC 的 Source,而 YAML API 下层不仅有 Source,还有 Sink ,这是最大的不同。此外,在 YAML API 下面还有一层 CDC Runtime,这其中包含一些运行时的算子逻辑。比如为了实现 Schema Evolution、要提供 Table Route 和 Transform 等特性的支持,就需要在运行时插入一些额外的流处理算子;而 DataStream API 和 SQL API 都不能提供这样的能力。

2.8 SQL 作业 vs YAML 作业

21be93b430f3365ee0c332192179f83a.jpeg

从用户的角度来看,SQL 作业和 YAML 管道在处理数据变更(CDC, Change Data Capture)时存在一些关键差异。Flink SQL 在处理变更日志时,会将每次更新操作拆分为四条独立的数据记录:插入(Insert)、更新前(Update Before)、更新后(Update After)以及删除(Delete)。虽然这种机制有助于某些类型的计算优化,但同时也破坏了更新操作的原子性,使得原始更新信息难以复原。相比之下,设计一种能够完整保留更新事件(Update)的数据结构,如自定义的 DataChangeEvent,可以更好地支持从源数据库(例如 MySQL)到消息队列(如 Kafka)的数据同步过程,从而让下游业务系统更易于消费这些变更。

此外,在YAML格式定义的数据管道中引入对模式变更事件的支持(比如CreateTableEvent、AddColumnEvent 等),可以让表结构变更事件的处理更加灵活与直观。当数据源端识别到添加列的 DDL 事件时,可以通过在数据流中插入特殊事件来通知下游动态地调整目标存储(如 Paimon 表)的结构,同时保持整个分布式流程的一致性和高效性。对于拥有大量数据记录的大规模记录的表而言,特殊的标识事件效率比起手动替换数据记录高效得多。例如,如果需要将 Truncate Table 清空表事件同步到下游,使用标识事件的方式相比发送数以亿计的 Delete 事件来清空旧表——显然更加简洁且资源消耗更低。

上述优化和改进策略,不仅增强了系统的灵活性和可维护性,还提高了处理大规模数据集时的效率。

c758be1e9901a29a15d6a5a4c645f547.jpeg

在使用 Flink SQL 进行作业开发时,尤其是涉及整库同步的场景,通常需要编写大量的 DDL 语句来创建表。这种方式存在几个主要问题:首先,它难以应对表结构的变化,所有的字段名称及类型都需要在设计作业时确定。其次,当表结构发生变化时,更新(Update)操作的变更日志(Changelog)语义可能会被破坏;最后,由于每张表都需要对应一个处理节点,这会导致整个作业的拓扑变得异常庞大且复杂,给 Flink 集群及其管理器带来了较大压力,尤其是在构建 ODS 层等大规模数据集成任务中尤为明显。

相比之下,采用 YAML 配置文件定义作业的方式提供了更灵活的解决方案。这种模式下,系统能够自动检测并适应表结构的变化,并且支持表结构变更同步功能。这不仅限于基本的上下游同步,还包括了更加精细级别的 Schema 调整能力。此外,在提交分库分表的整库同步作业时,当前版本的 Source 和 Sink 组件已经可以支持单个实例读写多个表的操作,这意味着不再需要为数据库中的每一单独表格都创建独立的物理算子,从而极大地简化了作业的设计与执行流程——从视觉上来看,整个同步过程仅需通过两个关键节点就能完成,而不是像之前那样,每张表都需要独立的 Source 节点并各自读取 Binlog。这种方法有效减轻了对 Flink 集群资源的需求,同时也提高了整体系统的可维护性和扩展性。

2.9 DataStream 作业 vs YAML 作业

d62693df97b79b99124e1344e01f91ff.jpeg

对比一下 DataStream 作业和 YAML 作业,如果一个 Flink DataStream作业,需要用 CDC JSON Format 描述数据结构。这意味着每一条数据记录中,都需要携带对应 Schema 的信息描述。考虑到表结构变更并不常见,大部分数据记录的 Schema 都一样,重复发送给下游的 Schema 就会造成信息冗余、存储空间和 IO 带宽的浪费。而在 YAML CDC 中,数据记录中所有的结构都是经过压缩的 Binary Data,相比 DataStream 的数据记录结构更紧凑,在底层的物理存储上更加节约内存。此外,YAML 作业只在 Schema 发生变化时发送 SchemaChangeEvent 来描述变更信息,即总是使用最新的的 Schema 来描述随后的所有 DataChangeEvent,直到新的 SchemaChangeEvent 出现。这样的设计不用给每条数据记录携带一份 Schema 数据,减少了信息冗余。

4d4ccb3485b0861e5a2fcce01a1b76c0.jpeg

总结一下 DataStream API 和 YAML API 的区别。DataStream API 主要面向熟悉 Java、Scala 的开发者,且需要对分布式系统有一定理解,才能写出正确且高效的 Flink 作业(包括 Flink 的 DataStream API,持久化 State Backend、Checkpoint 模型等)。此外,为了将 Jar 作业提交到 Flink 上正确执行,还需要了解 Maven 及依赖管理相关的知识。最后,Java 作业其实是比较难以复用的;一个描述 MySQL 写入 Paimon 的 Jar 作业,想要迁移写入 Kafka,很多部分可能都需要从头重写。

而 YAML API 就可以比较轻易地应对这些问题。它面向普通用户,不要求高深的前置知识,即可构建强大的整库同步、表结构同步作业。此外,YAML 语法很简单,业界也比较通用,想要复用已有作业就更简单了,因为它只不过是一段文本,只需要对 Source、Sink 的部分属性稍加修改,就能实现写入目标的迁移。

2.10 YAML 核心特性:Schema Evolution

10522b36b34dffe0b07c73235a6ddd4d.jpeg

下面介绍 YAML 的核心特性,第一个是上下游同步的表结构变更(Schema Evolution)。核心原理是在 YAML Pipeline 中传递的事件类型是 Event,既包括描述数据记录变更的 DataChangeEvent,也包括描述表结构变更的 SchemaChangeEvent。在遇到表结构变更事件时,将 Pipeline 里现存的数据全部落盘,然后根据 SchemaChangeEvent 进行表结构的演化,成功后即可继续处理上游数据。

3c6643f16ac2d02929468e09103f1d7f.jpeg

目前,上游 MySQL 数据库中可能发生很多 DDL 变化,例如新增表、新增列,修改列类型、重命名列、删表删列等,但在实际业务中,不同类型的结构变更可能有不同的处理需求。

例如上游某一列被删除了,下游可能希望保留;部分上游支持的表结构变更,下游可能无法实现。又或者是用户不希望下游表的结构发生改变,不用动业务代码。这样的诉求可以通过 Schema Change Behavior 选项和细粒度配置实现。

目前社区推荐使用 LENIENT 和 TRY_EVOLVE 两种模式。LENIENT 是最宽容的模式,能够保证 Schema 的向前兼容性,下游业务方的业务代码不用动。TRY_EVOLVE 会尽量将上游表的变更应用到下游,但相比 EVOLVE 模式略微宽容些,会做一定程度的容错。

其他两种模式就比较简单了。EXCEPTION 模式碰到 SchemaChange 就直接抛异常,IGNORE 模式则是忽略所有表结构变更,保证下游 Schema 始终不变。

03

Transform + AI

3.1 YAML 核心特性:Transform 设计

d882de30ae43ddea1054cdb3f24c1175.jpeg

Transform 数据加工过程是 ETL 当中 T 的部分。其中主要的需求包括从表中现存的列里投影出部分列、根据特定表达式的值筛选出特定的数据行、根据已有列计算出新列并加入其中。

例如,一个较为复杂的场景可能是这样的:上游存在一个 age 字段,希望追加一个布尔变量 flag,判断 age 是否大于 18,并且只保留 age 和 flag 字段到下游,删除其余数据列。此外,计算列可能涉及到用户定义函数逻辑,甚至调用外部 Web 服务。此外,用户可能还希望根据条件表达式对数据行进行过滤。在合并分库分表写入 Paimon 等数据湖下游时,可能需要手动指定主键列(Primary Key)和分区列(Partition Key)。此外,在结合 AI 场景下是否能支持大模型的调用,这都是 Transform 需要解决的问题。

3.2 YAML 核心特性:Transform 实现

2f40a2fb756e9f8822ab95dc4dc45e71.jpeg

CDC YAML 为 Transform 选择的语法是类 SQL 的表达式。可以看到 Projection 和 Filter 字段完全是 SQL 表达,对于指定的 app_db.orders表,Projection 里写出的是下游希望读到的字段。其中支持使用 UDF 函数和计算列,Filter 可以简单类比成 SQL 里的 WHERE 字段后面跟的条件,例如 ID 列不为空、price 列的值 >= 100 等组合的表达式。实现上,YAML 的类 SQL 语法首先被转换为标准的 SQL 语句,并使用 Calcite 进行解析,最终用 Janino 模版引擎动态编译成单个可复用的表达式后进行求值。实现上还需要考虑 Schema Evolution 导致的缓存失效等问题。

de9d40891f4548a6f4e8715e02866b94.jpeg

目前 Transform 实现的整体拓扑图如上所示。其中 PreTransform 和 PostTransform 都是可选的节点,在用户没有编写任何 Transform 规则时不存在,默认行为是将 Source 下发的数据记录原封不动的发给下游的 Schema Operator 和 Data Sink 节点。

3.3 YAML 核心特性:AI model 集成

ff39f594546f3e488a05d9e712e230e1.jpeg

YAML Pipeline 与 AI Model 的深度集成如图所示。左侧是 Flink CDC 从 MySQL 产生的 Binlog 日志中捕获到最新的实时业务数据,并且同步到下游的 StarRocks OLAP 系统或 ElasticSearch 系统构建搜索场景。

既然 Transform 已经支持调用任意的 UDF 函数,那能否与 AI 模型集成呢?答案是可以的。在知识库或广告营销、金融这类时效性要求比较强的业务场景中,AI 模型的集成是具备实际需求的,例如 RAG、广告的实时投放、金融行业的实时风控等。

3.4 YAML 核心特性:AI model 设计

14997a884c69ba04144910bacd1b0860.jpeg

YAML 集成 AI Model 能力的 API 设计如图所示。用户可以在 Pipeline 级别定义 AI Model,目前内置了 Embedding 和 Chat 两类模型。想要调用模型只需要指定 Model 类型、提供一些必要的参数(例如 Host 和 Key 等)即可,生命的模型可以直接在 Transform 表达式中调用。

这个例子的场景是从 testdb.articles 表中提取最新发布的文章内容,根据文章的标题及内容生成向量,灌入 ElasticSearch 中,配合整体的 RAG 设计,ElasticSearch 里的向量就代表今天最新的文章的信息,可以用于下游模型的答案生成,实时更新。这是 Flink 实时数据的计算引擎、Flink CDC 实时数据集成框架给 AI 带来的切实收益,通过处理实时数据来帮助模型生成更准确的答案。

AI Model API 的设计上能够兼容多种模型,且各个模型的参数可以通过 YAML 自定义配置。同时支持开源和闭源模型,例如 ChatGPT 和阿里的通义千问模型。此外,模型的复用也非常简单,只需复制粘贴模型定义配置项即可。

3.5 YAML 核心特性:AI model 实现

d406aa33e15812ee47a1a941181a4c69.jpeg

AI Model 集成在社区分配的 JIRA Ticket 为 FLINK-36525,并且已经合入社区 master 分支,欢迎大家自行编译体验(笔者注:春节前发布的 Flink CDC 3.3.0 版本已经支持该特性)。

04

Community

4.1 Flink CDC 社区动态

3438947f7bc5376afd9b4b10123e4ec6.jpeg

上图是 Flink CDC 社区在 2023 年和 2024 年的数据对比(截止到十月制作 PPT 之时)。社区贡献者从 101 位增加到 140 几位,增长 40% 多。主分支上的代码 commit 数量随着最近一年在 Scheme Evolution、YAML、AI Model 的集成等功能的实现,Commits 数量大幅增加 50%。社区的 Stars 现在大概有 5000+。

4.2 Flink CDC 社区规划

910dac48958d7a9fc512a0f44f51ba4e.jpeg

社区规划方面主要分为两部分。第一部分,我们希望解锁更多新的场景,例如 AI Model 的深度集成(笔者注:春节前发布的 Flink CDC 3.3.0 版本已经支持该特性),支持 Batch Pipeline、流批一体等;对接更多的上下游,例如支持 Apache Iceberg,之后会由货拉拉和天翼云的老师一起推动。此外还有支持更多 Schema Change 类型,例如 MySQL 的 Schema 类型总共大概有三十几种,目前应该只支持十几种,许多罕见的类型也希望能够完整支持,保证在线上极端的 Schema 变更的 Case 都能覆盖到。

另一部分是关于稳定性的打磨,包括数据限流,细粒度的异常工程。这里的稳定性指的不是 Flink 框架不稳定或者 CDC 框架不稳定,主要是因为 Pipeline 作业和上下游息息相关,上游 DB 负载高, CPU 高或者下游的 Kafka 写的时候压力太大都会导致 Pipeline 不稳定,但是它的根因并不一定在框架,但框架提供的容错支持能够极大地改善用户体验。围绕这部分的工作包括数据限流、兼容更多的 Flink 版本,依赖库版本升级等等。

4.3 欢迎加入开源社区

e3b61c2ef2fbd3e750ff8c4d75dcfcf7.jpeg

Flink CDC 作为 Apache Flink 最活跃的官方子项目,有独立的文档网站。关于项目的任何讨论,都可以在 Flink 的开发者邮件列表中发出,也可以在 Github 上提交代码 PR,中文用户也可以加入Flink CDC 社区用户钉钉群,钉钉群号:80655011780。右图是参与代码提交的贡献者,GitHub 默认截图只能截 Top100,目前社区已经有超过 150 名代码贡献者。欢迎大家加入!

  • 独立的文档网站: https://nightlies.apache.org/flink/flink-cdc-docs-stable 

  • 在 Flink 社区邮件列表讨论: dev@flink.apache.org / user@flink.apache.org 

  • 在 Apache JIRA 管理需求和缺陷: https://issues.apache.org/jira

  • 在 GitHub 上提交代码PR : https://github.com/apache/flink-cdc


如何通过 Flink CDC 实现高效、可靠的实时数据同步方案?

复制下方链接或点击阅读原文

即刻了解详细方案:

https://www.aliyun.com/solution/tech-solution/flink-cdc-realize-data-synchronization?utm_content=g_1000401146

a23a3286e5b1e97837536a42e7907d50.png

相关文章:

Flink CDC YAML:面向数据集成的 API 设计

摘要:本文整理自阿里云智能集团 、Flink PMC Member & Committer 徐榜江(雪尽)老师在 Flink Forward Asia 2024 数据集成(一)专场中的分享。主要分为以下四个方面: Flink CDC YAML API Transform A…...

计算机网络知识速记:TCP 与 UDP

计算机网络知识速记:TCP 与 UDP 一、概念 TCP (Transmission Control Protocol): 一个面向连接的协议,确保数据在传输过程中完整无误。通过建立连接和数据确认机制,提高数据传输的可靠性。是面向字节传输的。 UDP (User Datagram Protocol)…...

差分算法解析

差分(Difference Array)是一种常见的算法技巧,广泛应用于区间更新与区间查询的问题。它通过将数组的更新操作转化为数组的差分操作,使得某些类型的算法能在更短的时间内完成计算,尤其在处理频繁的区间更新时表现得尤为…...

makefile 的strip,filter,ifeq,ifneq基础使用

目录 一、strip1.1 语法1.2 示例1.3 使用场景 二、filter2.1 语法2.2 示例2.3 使用 * 和 ? 通配符2.4 结合使用2.5 使用场景 三、ifeq 和 ifneq3.1 ifeq3.1.1 语法3.1.2 示例 3.2 ifneq3.2.1 语法3.2.2 示例 3.3 典型使用场景3.3.1 根据版本控制编译选项:3.3.2 选择不同的源文…...

SOA(面向服务架构)全面解析

1. 引言 什么是SOA(面向服务架构) SOA(Service-Oriented Architecture,面向服务架构)是一种将应用程序功能以“服务”的形式进行模块化设计的架构风格。这些服务是独立的功能模块,它们通过定义明确的接口…...

B树详解及其C语言实现

目录 一、B树的基本原理 二、B树操作过程图形化演示 三、B树的应用场景 四、C语言实现B树及示例 五、代码执行结果说明 六、应用实例:文件系统目录索引 七、总结 一、B树的基本原理 B树(B-Tree) 是一种自平衡的树数据结构,…...

3.1 学习UVM中的uvm_component类分为几步?

文章目录 前言一、定义1.1 角色和功能:1.2 与其他UVM类的区别:1.3 主要属性和方法: 二、使用方法2.1 定义和实例化:2.2 生命周期管理:2.3 组件间通信: 三、何时使用3.1 使用场景3.2 适用组件3.3 与uvm_obje…...

python:面向对象之魔法方法

概念:主要是提供一些特殊的功能。 1.__init__方法: 一.不带参数: python中类似__xx__() __init__():初始化对象class Car():def __init__(self):self.color blueself.type suvdef info(self):print(f车的颜色是:{self.color})p…...

postgresql 游标(cursor)的使用

概述 PostgreSQL游标可以封装查询并对其中每一行记录进行单独处理。当我们想对大量结果集进行分批处理时可以使用游标,因为一次性处理可能造成内存溢出。 另外我们可以定义函数返回游标类型变量,这是函数返回大数据集的有效方式,函数调用者…...

vivado 7 系列器件时钟

7 系列器件时钟 注释: 本章节以 Virtex -7 时钟源为例。 Virtex-6 的时钟资源与此类似。如果使用不同的架构,请参阅有关器件的 《时 钟资源指南》 [ 参照 40] 。 Virtex-6 和 Virtex-7 器件内含 32 个称为 BUFG 的全局时钟缓存。 BUFG 可满…...

Vue 3 部分新特性解析

1. 引言 Vue 3 引入了许多新特性和改进,使得开发更加高效和灵活。本文将深入探讨 Vue 3 的高阶部分,包括 Composition API、自定义指令、插件开发、状态管理和性能优化。 2. Composition API 2.1 引入 Composition API Composition API 是 Vue 3 中引…...

ubuntu24.04安装布置ros

最近换电脑布置机器人环境,下了24.04,但是网上的都不太合适,于是自己试着布置好了,留作有需要的人一起看看。 文章目录 目录 前言 一、确认 ROS 发行版名称 二、检查你的 Ubuntu 版本 三、安装正确的 ROS 发行版 四、对于Ubuntu24…...

数据结构与算法-链表

单向链表(带哨兵) public class SinglyLinkedList {private Node head new Node(Integer.MIN_VALUE, null); // 定义一个哨兵节点作为头部节点,避免对头节点进行特殊处理// 节点类,包含值和指向下一个节点的引用private static …...

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中,会产生大量的医学影像图片,如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存,需要将每个患者文件夹下的图片合并成…...

协议-ACLLite-ffmpeg

是什么? FFmpeg是一个开源的多媒体处理工具包,它集成了多种功能,包括音视频的录制、转换和流式传输处理。FFmpeg由一系列的库和工具组成,其中最核心的是libavcodec和libavformat库。 libavcodec是一个领先的音频/视频编解码器库&…...

flask开发的网站,后端服务关闭后,可以找回之前的数据的吗

如果使用 Flask 开发的网页,后端服务关闭后,是否还能找回数据取决于数据的存储方式: 可能找回数据的情况: 数据库存储(MySQL、PostgreSQL、SQLite 等) 如果 Flask 连接的是持久化数据库,即使后…...

deepseek API开发简介

1、申请deepseek api key: https://platform.deepseek.com/api_keys创建API Key,并复制Key 2、安装python、pip,然后安装requests pip install requests3、.示例代码 import requests import json# DeepSeek API 地址 API_URL "ht…...

【AI】在Ubuntu中使用docker对DeepSeek的部署与使用

这篇文章前言是我基于部署好的deepseek-r1:8b模型跑出来的 关于部署DeepSeek的前言与介绍 在当今快速发展的技术环境中,有效地利用机器学习工具来解决问题变得越来越重要。今天,我将引入一个名为DeepSeek 的工具,它作为一种强大的搜索引擎&a…...

Baklib推进内容中台智能推荐系统的技术创新与执行方案

内容概要 在当前数字化快速发展的背景下,内容中台的智能化推荐系统显得尤为重要。通过技术创新,Baklib致力于提升平台的用户体验,实现精准的个性化推荐,满足多样化的用户需求。内容中台不仅能够高效管理和组织大量的信息与知识&a…...

MySQL8.0实现MHA高可用

一、简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点&#xf…...

ip地址是手机号地址还是手机地址

在数字化生活的浪潮中,IP地址、手机号和手机地址这三个概念如影随形,它们各自承载着网络世界的独特功能,却又因名称和功能的相似性而时常被混淆。尤其是“IP地址”这一术语,经常被错误地与手机号地址或手机地址划上等号。本文旨在…...

多光谱成像技术在华为Mate70系列的应用

华为Mate70系列搭载了光谱技术的产物——红枫原色摄像头,这是一款150万像素的多光谱摄像头。 相较于普通摄像头,它具有以下优势: 色彩还原度高:色彩还原准确度提升约 120%,能捕捉更多光谱信息,使拍摄照片色…...

21.2.6 字体和边框

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 通过设置Rang.Font对象的几个成员就可以修改字体,设置Range.Borders就可以修改边框样式。 【例 21.6】【项目&#xff…...

详解命令模式

引言 当遇到发送者和接受者之间不是直接连接关系,而是间接连接关系,即发送者和接受者之间需要解耦,我们通常需要命令模式。比如电灯和开关,开关设计时并不知道自己是控制电灯的,也可能控制排气扇、电力设备等等&#x…...

Debian 安装 Nextcloud 使用 MariaDB 数据库 + Caddy + PHP-FPM

前言 之前通过 docker在ubuntu上安装Nextcloud,但是现在我使用PVE安装Debian虚拟机,不想通过docker安装了。下面开始折腾。 安装过程 步骤 1:更新系统并安装必要的软件 sudo apt update && sudo apt upgrade -y sudo apt install…...

string 与 wstring 的字符编码

测试代码: #include<stdio.h> #include<stdlib.h> #include<windows.h> #include <locale.h> #include <string> #include <iostream>// 函数用于计算UTF-8字符串中的字符数 int utf8_strlen(const char* str) {int len = 0;for (; *s…...

golang 开启HTTP代理认证

内部网路不能直接访问外网接口&#xff0c;可以通过代理发送HTTP请求。 HTTP代理服务需要进行认证。 package cmdimport ("fmt""io/ioutil""log""net/http""net/url""strings" )// 推送CBC07功能 func main() {l…...

第九届华为ICT大赛实践赛中国总决赛举行通知及考试地址

经大赛组委会决定&#xff0c;第九届华为ICT大赛实践赛中国总决赛将于2025年3月8日-9日举行具体赛事安排如下&#xff0c;期待与您顶峰相见! 理论考试:线上答题&#xff0c;团队3名成员共同完成1套试题&#xff0c;统一提交一份答案【60分钟&#xff0c;20道试题(含判断、单选…...

FFmpeg 与 FFplay 参数详解:-f、-pix_fmt、-pixel_format 和 -video_size 的区别与用法

FFmpeg 与 FFplay 参数详解:-f、-pix_fmt、-pixel_format 和 -video_size 的区别与用法 在使用 FFmpeg 和 FFplay 进行视频处理和播放时,-f、-pix_fmt、-pixel_format 和 -video_size 是常用的参数。这些参数的作用和使用场景略有不同,理解它们的区别和用法对于正确处理和播…...

深入理解 C++17 std::is_swappable

文章目录 深入理解 C17 std::is_swappable引言std::is_swappable 概述std::is_swappable 的工作原理std::is_swappable 的变体注意事项结论 深入理解 C17 std::is_swappable 引言 在 C 编程中&#xff0c;交换两个对象的值是一个常见的操作。为了确保代码的通用性和安全性&am…...

直接插入排序

一&#xff1a;直接插入排序是什么。 二&#xff1a;如何实现直接插入排序 三&#xff1a;直接插入排序时间复杂度 一&#xff1a;直接插入排序它是排序得一种&#xff0c;其目的无非是将乱序通过排序排成有序的。 我们可以通过动画直观看什么是直接插入排序 这是我找的直接…...

基于可信数据空间的企业数据要素与流通体系建设(附ppt 下载)

近期&#xff0c;可信数据空间会议召开。大数据系统软件国家工程研究中心总工程师王晨发表了题为《基于可信数据空间的企业数据要素与流通体系建设》主旨演讲。 WeChat Subscription Account【智慧城市指北】&#xff0c;可搜索相关关键字“20250107”&#xff0c;可获取具体获…...

处理 this

this指向改变this this指向 构造函数和原型对象都指向 实例 改变this指向的三个方法&#xff1a; call()apply()bind() call() apply() 与call的区别就是call中参数任意&#xff0c;但是apply中参数必须是数组 bind&#xff08;&#xff09;&#xff08;最重要&#xff09; 与…...

kafka服务端之日志存储

文章目录 日志布局日志索引日志清理日志删除基于时间基千日志大小基于日志起始偏移量 日志压缩总结 日志布局 Ka饮a 中的消息是以主题为基本单位进行归类的&#xff0c; 各个主题在逻辑 上相互独立。 每个主题又可以分为一个或多个分区&#xff0c; 分区的数量可以在主题创建的…...

【Apache Paimon】-- 15 -- 利用 paimon-flink-action 同步 postgresql 表数据

利用 Paimon Schema Evolution 核心特性同步变更的 postgresql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工消息通知,然后手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hi…...

正则表达式进阶(二)——零宽断言详解:\b \B \K \z \A

在正则表达式中&#xff0c;零宽断言是一种非常强大的工具&#xff0c;能够在不消费字符的情况下对匹配位置进行约束。除了环视&#xff08;lookahead 和 lookbehind&#xff09;以外&#xff0c;还有一些常用的零宽断言&#xff0c;它们用于处理边界、字符串的开头和结尾等特殊…...

java poi Excel 文件导入导出常见错误及解决方案

在使用 Apache POI 进行 Excel 文件的导入导出操作时&#xff0c;可能会遇到各种问题。以下是一些常见的错误及其解决方案&#xff1a; 一、文件格式相关问题 1. 文件格式不兼容 问题描述&#xff1a;尝试使用 HSSFWorkbook 读取 .xlsx 文件&#xff0c;或者使用 XSSFWorkbo…...

批量提取word表格数据到一个excel

新建一个excel到word同级目录altf11打开vba窗口并新建模块粘贴下方代码&#xff08;修改一些必要参数&#xff09;回到excel表格界面&#xff0c;altf8选择执行该宏注意要在信任中心开启运行vba宏 Sub 批量提取word表格数据到excel()Dim wdApp As Object, wdDoc As ObjectDim …...

快速建立私有化知识库(私有化训练DeepSeek,通过ollama方式)

简介 什么&#xff1f;&#xff01;老是有人问你需求&#xff0c;不同版本的需求你记不清还得去扒拉过程文档、设计文档&#xff1f; 什么&#xff1f;&#xff01;领导会询问功能使用情况、用户相关数据&#xff0c;你每次还得手动查询反馈&#xff1f; 什么&#xff1f;&…...

python 一句话打印行号

在C语言中&#xff0c;打印行号可以直接用预定义的宏__LINE__&#xff0c;打印当前行号&#xff0c;方便调试。 printf("%d", __LINE__); // C语言打印当前行号 python中没有这样的预定义宏。 但可以用这种方式&#xff0c;实现一句话打印行号&#xff1a; impor…...

设计模式-生产者消费者模型

阻塞队列&#xff1a; 在介绍生产消费者模型之前&#xff0c;我们先认识一下阻塞队列。 阻塞队列是一种支持阻塞操作的队列&#xff0c;常用于生产者消费者模型&#xff0c;它提供了线程安全的队列操作&#xff0c;并且在队列为空或满时&#xff0c;能够阻塞等待&#xff0c;…...

Kubernetes是什么?为什么它是云原生的基石

从“手工时代”到“自动化工厂” 想象一下&#xff0c;你正在经营一家工厂。在传统模式下&#xff0c;每个工人&#xff08;服务器&#xff09;需要手动组装产品&#xff08;应用&#xff09;&#xff0c;效率低下且容易出错。而Kubernetes&#xff08;k8s&#xff09;就像一个…...

全国计算机等级考试(NCRE)四级计算机网络考试大纲(2025年版)

文章目录 基本要求1. 理解计算机网络的基本概念。2. 掌握局域网的基本工作原理。局域网&#xff08;LAN&#xff09;基本工作原理 3. 掌握TCP/IP及其相关协议。 TCP/IP协议及其相关协议1. TCP/IP协议的分层结构2. 主要协议详解&#xff08;1&#xff09;IP协议&#xff08;2&am…...

扩展知识--缓存和分时复用cpu

在多核CPU中&#xff0c;缓存和分时复用CPU是两个重要的概念&#xff0c;它们分别涉及硬件架构和资源管理策略。以下将从缓存的层次结构、工作原理以及分时复用CPU的概念进行详细解释。 一、多核CPU中的缓存 缓存的定义与作用 缓存&#xff08;Cache&#xff09;是位于CPU与主…...

6.Centos7上部署flask+SQLAlchemy+python+达梦数据库

情况说明 前面已经介绍了window上使用pycharm工具开发项目时,window版的python连接达梦数据库需要的第三方包。 这篇文章讲述,centos7上的python版本连接达梦数据库需要的第三方包。 之前是在windows上安装达梦数据库的客户端,将驱动包安装到windows版本的python中。(开…...

如何将3DMAX中的3D文件转换为AutoCAD中的2D图形?

大家好,今天我们来探讨一下如何将3DMAX中的3D文件转换为AutoCAD中的2D图形。无论是出于设计交流、施工准备还是其他实际需求,这种转换在工程设计领域都是一项非常实用的技能。接下来,我将为大家详细介绍几种实现这一转换的方法,帮助大家轻松跨越3D与2D设计之间的鸿沟。让我…...

使用LLaMA Factory踩坑记录

前置条件&#xff1a;电脑显卡RTX 4080 问题&#xff1a;LLaMA-Factory在运行的时候&#xff0c;弹出未检测到CUDA的报错信息 结论&#xff1a;出现了以上的报错&#xff0c;主要可以归结于以下两个方面&#xff1a; 1、没有安装GPU版本的pytorch&#xff0c;下载的是CPU版本…...

四柱预测学

图表 后天八卦 十二地支不仅代表了时间,还代表了方位。具体来说: ‌子‌:代表正北方‌丑寅‌:合起来代表东北方‌卯‌:代表正东方‌辰巳‌:合起来代表东南方‌午‌:代表正南方‌未申‌:合起来代表西南方‌酉‌:代表正西方‌戌亥‌:合起来代表西北方‌四季-五行-六神…...

使用 JFreeChart 创建动态图表:从入门到实战

文章目录 前言一、JFreeChart 简介二、环境准备三、 创建第一个折线图四、自定义图表样式4.1 设置背景色4.2 设置折线颜色4.3 设置字体&#xff08;解决中文乱码&#xff09;4.4 设置横坐标的标签宽度和方向 五、导出图表六、实战&#xff1a;动态生成日报图表总结 前言 在数据…...

【自学笔记】文言一心的基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 文心一言知识点总览一、文心一言简介二、文心一言的核心功能三、文心一言的技术特点四、文心一言的应用场景五、文心一言的使用技巧六、文心一言的未来发展 总结 文…...