结项报告完整版:Apache SeaTunnel 支持 Flink 引擎 Schema Evolution 功能

news/2025/11/12 11:19:06/文章来源:https://www.cnblogs.com/seatunnel/p/19213038

过去两周,我们对开源之夏活动中表现优异的开发者们进行了简单的采访,初步粗略地了解了一下他们的开发过程和心得体会。今天,我们将通过同学们的完整结项报告,深入了解项目的开发技术细节,希望能够帮助大家更好地了解 Apache SeaTunnel 项目的最新进展。

接下来是关于在 Flink 引擎上对 Schema Evolution 功能的支持这一项目的完整报告:

一. 已完成工作

根据原定方案(https://ycn2sw1zdz0c.feishu.cn/wiki/QTxYwPcytiG4bxku0vQcrvtlnlb)和时间规 划,已完成在 Flink 引擎上对 Schema Evolution 功能的支持,目前 Sink 端已支持在 Flink 引擎 上进行流式变更的有: JdbcSinkWriter , JdbcExactlyOnceSinkWriter , ConsoleSinkWriter ,已 经测试完毕,目前没有发现在 Schema Evolution 流程中有明显 bug。

✅在 source 和 transform 之间动态插入算子,如果检测到实现了 SupportSchemaEvolution 的类, 并且开启了 schema evolution 的配置,则插入SchemaOperator。
✅实现 SchemaCoordiantor 协调器,接收 sink 端上报的刷写信息,同时接收 SchemaOperator 上 报的 Schema 变更请求。
✅扩展 SchemaChangeEvent子类,支持 FlushEvent 事件流转。
✅扩展 SupportSchemaEvolutionSinkWriter 方法,支持上报刷写成功信息,处理 FlushEvent。
✅实现 SchemaOperator 算子,检测被 source 端发出的变更事件并处理,支持变更事件透传到下 游。
✅重写 SupportSchemaEvolutionSinkWriter 关于 Schema evolution方法,目前支持
JdbcSinkWriter,JdbcExactlyOnceSinkWriter ,ConsoleSinkWriter,测试完毕,符合预期。
✅扩展 FlinkRowCollector 的 collect 方法,支持变更事件的收集。
✅扩展 FlinkSinkWriter 方法,支持检测变更事件并处理。
✅扩展 SchemaEvolution 错误码和异常体系,变更出现异常时支持详细异常信息上报。
✅变更任务出现异常后,自动抛出异常,交给重试机制处理。

二. 遇到的问题及解决方案

1. 事件流转问题

在 source 端和 transform 中间插入一个 operator时,需要在内部判断流转过来的元素是否是事 件,如果是事件,就阻塞,等待刷写变更之后再次流转;否则就继续向下流转,有两种方案:

  • 和 Zeta 引擎保持一致,创建类似 Record 的类 StreamElement ,但是从 source 到 transform 到 sink 端的所有链路,关于 SeatunnelRow 的都要修改为 StreamElement,入侵性极高,且非常危 险,影响面大。
  • 在 SeatunnelRow 中添加特殊标记,比如在 options 里面添加一个选项,如果遇到事件,存储到额 外信息里面,这样对链路入侵性不高,但是违反单一设计原则,按理来说 SeatunnelRow 不应该关 心事件,只负责数据流转,之后如果架构升级可以重构,目前以实现功能为主,减小风险。

之后就可以在 SchemaOperator 算子里面检测到这个标记了:


但是这样同样会带来一个问题,就是我们 new 了一个空行,会导致 sink 端的写入报错,所以需要 在 sink 端检测:




这样就能解决事件透传的问题。

2. 多并行度问题

实际上在 Flink CDC 的实现中,增量快照阶段,按照用户定义并行度开启任务,读取快照数据;进 入增量阶段后,为了保证顺序,只会保留一个任务来读取,所以我们不需要给协调器多么复杂的实现, 让它正常接收 sink 端响应即可,也不用考虑多个分区重复上报以及顺序问题:







关于 source 端明明是一个任务,但是 sink 可能是多个任务的问题,看了下 flink cdc 相关源码, CDC source 确实是由一个任务来读取 binlog,但之后数据通过 KeyGroupStreamPartitioner 按主键 hash分发,不同的 key 被发送到不同的 sink 任务,每个 sink 任务处理分配给它的 key 范围的数据:

具体实现里面,会先检查 sink 端和 input 的并行度是否相同,如果不同,会采取 primary key shuffle 的手段:

sink 配置了自定义并行度且不等于输入并行度时, Flink 会进行特殊处理:

如果 sink 并行度与 input 并行度不同,会通过 primary key 进行 shuffle:

Flink 自己应该支持这种 sink 端的多并行度,但是我有几个考虑的点:

  1. 如果真要实现这种机制, Shuffle 的实现对我来说有难度。
  2. 如果多个并行度同时收到变更命令,对于幂等性的数据库来说,变更可能不受影响,但是像
    StarRocks 这种 OLAP 数据库没有幂等性,所以有困难,当然这种也有解决办法,就是收到几个分 区的刷写完成响应之后,协调器收到 ack,让协调器来变更,同样也很麻烦,不如让 source 和 sink 使用相同并行度,在一条算子链里面,也不用 shuffle,但是还有一个点是,数据量大的情况下可能 影响性能。

所以,我目前检测到 cdc 变更之后强制指定 sink 端并行度就是1,这样也不会有上面的问题,之后 可以进行迭代来支持 sink 端的需求:


3. 刷写与请求的执行顺序问题

之前在 SchemaOperator 算子里面处理变更事件的时候,我先发送了刷写事件,之后才请求协调器 进行变更,这样会有一个问题,协调器内部的 SchemaChangeState 还没有进行初始化,所以之后协调 器迟迟获取不到 State,先一步到的 FluEvent 也没有被成功接收, 一直阻塞,之后任务超过了我设定的 超时时间,任务就失败了。
分析日志后发现:

  • 12:33:36,597 - FlushEvent 被处理, Sink 立即上报了 flush 成功
  • 12:33:36,597 - 协调器警告: "No schema change state found"
  • 12:33:36,598 - 协调器才创建 schema change state

再次查看我写的代码:

所以问题就比较明显, Sink 的 flush 通知比协调器的 requestSchemaChange 更早到达,导致通知 被丢弃,我们只需要修改执行顺序即可解决此问题:


4. FlushData 和 变更问题

之前我在实现的时候, FlushEvent 内部包裹着 SchemaChangeEvent,在 FlushData 的同时就把表 变更了,这样有一个问题就是职责不清晰,比较混乱,之后就把职责分开,刷写数据就只刷写数据,之 后上报协调器,再次发送变更事件,真正进行变更:

5. 默认实现与接口职责问题

目前为了向前兼容,SupportSchemaEvolutionSinkWriter 中新增方法均被标记为 default,之后再 进行迭代。迭代完毕之后,即可取消 default 关键字:

6. 变更失败后标记失败 or 回滚问题

有一个问题是,假设说因为网络问题或者其他问题,作业失败了,那么应该直接标记作业失败,让 Flink 自己从检查点拉起作业,还是让其直接回滚?

Flink CDC 的实现是直接标记失败,之后从检查点恢复,目前我采用的是标记失败的策略,考虑的点 是,主动回滚开发相当麻烦,可能还需要 flink ck 进行适配,直接让 schema 变更失败时抛出异常,让现 有的重试机制处理就行,而且也观察到 SeaTunnel 这边做了重试相关的机制, Flink自己有全局重试策略,no ,fixed-delay ,failure-rate(已实现,已测试)。

因为要抛出异常,直接抛出 RuntimeException 对开发者定位问题和用户都不是很友好,所以增强 了异常机制,实现了自己的异常类,错误码和异常方法。
异常处理示例:


三. 测试用例与结果

关于 MySQLCDC to MySQL 场景测试报告如下:
✅add column 场景测试报告:https://ycn2sw1zdz0c.feishu.cn/wiki/XYotwQ7QeiJqsikiTEscBXwcn
✅drop column 场景测试报告: https://ycn2sw1zdz0c.feishu.cn/wiki/QU73wXqTpirfZmk6NDCc1i
1wnDf
✅modify column 场景测试报告: https://ycn2sw1zdz0c.feishu.cn/wiki/NXVwwTLf8iWUiFk6nGgcv GJGnmd
✅change column 场景测试报告: https://ycn2sw1zdz0c.feishu.cn/wiki/UoIvwdUcJiutXSkyvm1ceb
LcnUh

四. 后续工作计划

  • 目前并不是所有支持 schema evolution 的 sink 端均实现了,后续支持SupportSchemaEvolutionSinkWriter 相关子类的实现。
  • 测试不同数据源之间的流转情况,修复可能的小 bug。
  • 测试大量数据情况下是否会出现严重阻塞问题。
  • 测试高并发情况下是否有不一致性问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年水性环氧地坪漆定制厂家权威推荐榜单:环氧防静电地坪漆/环氧磨石地坪漆/环氧橘皮防滑地坪漆源头厂家精选

在环保法规日益严格和工业建筑标准不断提升的背景下,水性环氧地坪漆以其环保特性和卓越物理性能,正成为现代工业与商业地坪的首选解决方案。 水性环氧地坪漆作为建筑涂料行业的重要分支,其技术水平和产品质量直接关…

达梦数据库修改连接数

达梦数据库修改连接数修改达梦数据库最大连接数 // 查询当前是多少select SF_GET_PARA_VALUE(2,max_sessions); // 修改SP_SET_PARA_VALUE(2,max_sessions,200);重启数据库 修改达梦nulls last 参数排序ORDER_BY_NULLS…

2025年口碑好的双锥干燥机厂家推荐及选择指南

2025年口碑好的双锥干燥机厂家推荐及选择指南 行业背景与市场趋势 双锥干燥机作为制药、化工、食品等行业的核心干燥设备,其市场需求持续增长。据《2024年中国干燥设备行业报告》显示,2023年国内干燥设备市场规模达…

2025年11月酵母锌品牌评测榜:五强横向对比与口碑排名

锌是人体每日必需的微量矿物质,缺锌会导致儿童生长迟缓、味觉减退、反复感染,成人则易出现伤口愈合慢、脱发、免疫力下降。2025年《中国居民营养与慢性病状况报告》再次提示,3—14岁城市儿童锌摄入不足比例仍达18.7…

查询佳木斯高亮广告机市场趋势,获取报价与成本分析助力规划

近年来,广告机市场持续扩容,尤其在东北地区,以佳木斯为代表的三线城市对高亮广告机的需求显著上升。据2025年第三季度行业调研数据显示,国内高亮广告机(亮度≥2000尼特)的主流价格区间集中在3800元至9800元之间,…

SQL Server 2025年11月更新 - 修复 CVE-2025-59499 Microsoft SQL Server 特权提升漏洞

SQL Server 2025年11月更新 - 修复 CVE-2025-59499 Microsoft SQL Server 特权提升漏洞SQL Server 2025年11月更新 - 修复 CVE-2025-59499 Microsoft SQL Server 特权提升漏洞 Microsoft SQL Server 下载汇总 SQL Serv…

AI股票预测分析报告 - 2025年11月12日 11:10

AI股票预测分析报告 - 2025年11月12日 11:10body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

2025年广东城市智慧照明公司权威推荐榜单:智慧城市照明/智慧照明控制/智慧照明改造服务商精选

随着物联网技术与绿色低碳理念的深度融合,城市照明已从单一功能照明迈向智能化、网络化的全面升级,广东作为中国照明产业集聚区,正引领这一变革浪潮。 城市智慧照明作为新型智慧城市建设的核心组成部分,不仅关乎城…

什么是GEO生成式引擎优化?GEO科普:定义、原理与应用指南 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

完整教程:TDengine 数学函数 DEGRESS 用户手册

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

多屏开合屏,宜宾高端定制优选,全案交付更高效

在当前多屏开合屏设备快速普及的市场环境中,用户普遍面临需求与产品错配、参数筛选混乱、功能冗余或缺失等选购痛点。尤其在宜宾这类兼具工业制造与数字文旅双重属性的城市,不同行业对屏幕开合结构、响应速度、环境适…

RMAN delete归档报错 specification does not match any archived log in the repository

1、使用这个脚本无法不清理过期的归档[oracle@r7901:/home/oracle]\$ cat /home/oracle/scripts/del_arch.sh#!/bin/bashsource ~/.bash_profiledeltime=`date +"20%y%m%d%H%M%S"`rman target / nocatalog m…

C# 将多个wav格式的文件拼接(合并)成一个文件

1、nuget安装NAudio2、代码实现using NAudio.Wave; using System; using System.Collections.Generic; using System.IO; using System.Linq;namespace SoundWin.Common {public class WavFileMerger{/// <summary&…

2025年11月酵母锌品牌权威榜:五强对比评测与口碑排行解析

很多家长在秋冬换季时发现孩子食欲下降、身高增长放缓,体检报告又提示“锌摄入不足”,于是开始关注“酵母锌”这一相对温和的补锌形式。相比传统无机锌,酵母锌通过生物转化把锌元素嵌进酵母蛋白与多糖矩阵,理论上吸…

《ESP32-S3使用指南—IDF版 V1.6》第四十七章 lwIP初探

第四十七章 lwIP初探 1)实验平台:正点原子DNESP32S3开发板 2)章节摘自【正点原子】ESP32-S3使用指南—IDF版 V1.6 3)购买链接:https://detail.tmall.com/item.htm?&id=768499342659 4)全套实验源码+手册+视…

全连接层属于输入层、输出层还是隐藏层

全连接层本身不固定属于输入层、输出层或隐藏层,它是一种“层的连接结构”,可作为隐藏层或输出层,输入层通常不称为全连接层。 核心定义 全连接层(Fully Connected Layer)的核心是“层内每个神经元与前一层所有神…

2025年益阳移动滑轨屏趋势预测推荐

在当前数字化展示设备市场中,价格透明度已成为用户选购决策的重要依据。据2024年行业调研数据显示,全国范围内规范定价企业占比约为68%,其中价格公示完善度达到“优”级的企业不足四成。这一现状凸显出消费者在采购…

国产化印刷厂视频监控项目实施方案 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

基于STM32F103与A3988驱动芯片的两相四线步进电机控制方案

一、硬件 1. 引脚映射A3988引脚 功能 STM32引脚 说明STEP 步进脉冲 PA0 每脉冲转动一步DIR 方向控制 PA1 高/低电平控制转向ENABLE 使能信号 PA2 低电平有效MS1-MS3 细分设置 PB0-PB2 000=全步,001=半步等VREF 电流设…

2025IT 监控厂商选型指南:5 款高价值运维监控产品推荐,适配数字化转型需求

2025IT 监控厂商选型指南:5 款高价值运维监控产品推荐,适配数字化转型需求$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");文章对比5款主流运维监控系统,…