在Flink的数据流处理体系中,Sink函数作为数据处理的最终出口,肩负着将处理后的数据写入外部存储引擎的关键使命。它如同数据旅程的终点站,决定着数据的最终归宿与应用价值。深入理解Sink函数的工作原理、核心概念及实现方式,对构建高效、可靠的Flink数据处理作业至关重要。接下来,我们将基于详细笔记内容,全方位解析Flink Sink函数。

一、Sink函数核心概念与定位

Sink函数在Flink作业中占据独特且重要的位置,它没有下游算子,是数据处理流程的终点。一个Flink作业可包含一个或多个Sink函数,这些Sink函数并行或串行工作,将数据分别输出到不同的外部存储系统,如Kafka、HDFS、数据库等 ,满足多样化的数据存储与应用需求。例如,在电商实时数据分析场景中,一个Sink函数可将处理后的用户行为数据写入Kafka,供实时推荐系统使用;另一个Sink函数则可将销售统计数据写入数据库,用于生成报表。

二、二阶段提交协议:保障数据一致性的基石

2.1 协议组成与工作流程

二阶段提交(Two-phase Commit Protocol)是一种分布式事务协议,由事务管理器(Transaction Manager,TM)和多个资源管理器(Resource Manager,RM)构成。在分布式事务处理中,所有资源管理器向TM汇报自身活动状态,TM依据这些状态决定事务的提交或回滚操作。其具体流程如下:

  1. 事务发起:应用程序向TM提交请求,启动分布式事务。
  2. 第一阶段:准备阶段:TM通知所有RM提交事务,各RM接收到指令后,开始执行事务操作,但并不真正提交事务,而是将准备结果信息反馈给TM。若在准备事务阶段出现超时情况,则视为该RM操作失败。
  3. 第二阶段:决策阶段:TM根据所有RM的准备信息做出决策。若所有RM都准备成功,TM会下达提交事务的指令;只要有一个或多个RM准备失败,TM就会执行事务回滚操作,确保数据一致性 。

2.2 在Flink Sink中的意义

在Flink与外部存储系统交互时,二阶段提交协议起着关键作用。Flink自身虽能通过状态管理保证引擎内部数据处理的精准一次(Exactly-Once),但无法确保与外部引擎交互时的数据一致性。通过引入二阶段提交协议,结合Sink函数实现,能够保障端到端的数据一致性,避免因部分数据写入成功、部分失败导致的数据不一致问题 。

三、SinkFunction类体系深度剖析

3.1 SinkFunction接口

SinkFunction接口定义了数据操作的基本行为,但不具备函数生命周期管理能力。其核心方法包括:

  • invoke:该方法负责将给定的数据值写入接收器,每个输入记录都会触发此函数执行。例如,在将日志数据写入文件的Sink函数中,invoke方法会将每条日志记录写入对应的文件。
  • writeWatermark:用于将给定的水印写入接收器,主要适用于需要传播水印的高级接收器场景,如在实时流处理中,某些Sink需要感知水印以处理乱序数据 。
  • finish:在数据处理结束时调用,可用于执行一些清理或收尾操作,如关闭文件句柄、释放连接等 。

3.2 TwoPhaseCommitSinkFunction

为实现端到端的精准一次性,Flink引入了TwoPhaseCommitSinkFunction。它基于二阶段提交协议,借助Flink的检查点机制,确保在与外部存储系统交互时数据的一致性。理论上,只要满足以下条件,所有connector都能借助该函数实现端到端严格一致性语义:

  1. Sink端要求:Sink端需支持回滚机制或具备幂等性。回滚机制可在作业失败时将部分写入的结果恢复到初始状态;幂等性则保证即使作业失败后重新写入数据,也不会出现重复或不一致问题 。
  2. Source端要求:Source端必须支持断点读取功能,确保任务失败恢复后,能从断点处继续读取数据,保证数据处理的连续性 。

3.3 与函数生命周期管理的结合

SinkFunction和SourceFunction仅定义数据操作行为,而函数的生命周期管理主要由AbstractRichFunction承担。因此,无论是官方实现的connector,还是开发者自定义的connector,大多继承TwoPhaseCommitSinkFunction和RichSinkFunction,以实现数据操作与生命周期管理的结合 。

四、检查点函数:保障状态一致性的关键

Flink支持函数级别的状态保存和恢复,CheckpointedFunction和ListCheckpointed接口在其中发挥重要作用。CheckpointedFunction接口定义了snapshotState方法用于备份状态,initializeState方法用于恢复状态;ListCheckpointed接口则通过notifyCheckpointComplete标记备份完成,notifyCheckpointAborted终止备份操作 。这些接口与Sink函数配合,在作业失败恢复时,能够保证Sink函数从正确的状态继续执行,进一步增强数据处理的可靠性和一致性 。

五、SinkFunction实现示例:以Jdbc Connector Sink为例

JdbcSinkFunction的实现类为GenericJdbcSinkFunction,通过分析其代码可深入理解SinkFunction的具体实现逻辑。

public class GenericJdbcSinkFunction<T> extends RichSinkFunction<T>implements CheckpointedFunction, InputTypeConfigurable {private final JdbcOutputFormat<T,?,?> outputFormat;public GenericJdbcSinkFunction(@Nonnull JdbcOutputFormat<T,?,?> outputFormat) {this.outputFormat = Preconditions.checkNotNull(outputFormat);}// 函数生命周期管理,open也是@Overridepublic void open(Configuration parameters) throws Exception {super.open(parameters);RuntimeContext ctx = getRuntimeContext();outputFormat.setRuntimeContext(ctx);outputFormat.open(ctx.getIndexOfThisSubtask(), ctx.getNumberOfParallelSubtasks());}// 向外部写入数据@Overridepublic void invoke(T value, Context context) throws IOException {outputFormat.writeRecord(value);}@Overridepublic void initializeState(FunctionInitializationContext context) {}@Overridepublic void snapshotState(FunctionSnapshotContext context) throws Exception {outputFormat.flush();}@Overridepublic void close() {outputFormat.close();}@Overridepublic void setInputType(TypeInformation<?> type, ExecutionConfig executionConfig) {outputFormat.setInputType(type, executionConfig);}
}

在上述代码中,数据的具体操作由JdbcOutputFormat负责。invoke方法将接收到的数据传递给JdbcOutputFormat的writeRecord方法进行处理。JdbcOutputFormat的writeRecord方法采用批量写入策略,将数据暂存于批次中,当批次数据量达到设定的batchSize时,执行flush操作,将数据写入数据库,从而提高写入性能 。

六、总结与展望

通过对Flink Sink函数的深入解析,我们全面了解了其核心接口、二阶段提交协议、检查点函数以及具体实现方式。Sink函数作为Flink数据处理的关键环节,其设计与实现直接影响数据处理的完整性和一致性。在实际应用中,开发者需根据业务需求,合理选择和定制Sink函数,并结合二阶段提交协议和检查点机制,确保数据在复杂的分布式环境中可靠输出 。随着数据处理需求的不断变化和技术的持续发展,Flink Sink函数也将不断演进,为用户提供更强大、灵活的数据输出解决方案。

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

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

相关文章

Codex+ 自建中转 API 部署教程(Windows 版)

&#x1f4cc; 一、前置环境准备 安装 Node.js 和 Codex CLI&#xff1a; npm install -g openai/codex准备 OpenAI API Key 确保你已有的中转接口兼容 OpenAI 格式&#xff0c; &#x1f4cc; 二、设置 PowerShell 环境变量 # 设置你的 API Key&#xff08;使用哪家的看你的…

Centos 7离线部署Nginx 高效省时

给脚本执行权限&#xff1a;chmod x install_nginx.sh以root用户运行&#xff1a;sudo ./install_nginx.sh 脚本如下&#xff1a; #!/bin/bash # Nginx一键化部署脚本&#xff08;修复版本开机自启&#xff09; # 需要以root权限运行set -e # 任何命令失败时立即退出脚本# 定…

P7915 [CSP-S 2021] 回文

题目描述 给定正整数 n n n 和整数序列 a 1 , a 2 , … , a 2 n a_1, a_2, \ldots, a_{2 n} a1​,a2​,…,a2n​&#xff0c;在这 2 n 2 n 2n 个数中&#xff0c; 1 , 2 , … , n 1, 2, \ldots, n 1,2,…,n 分别各出现恰好 2 2 2 次。现在进行 2 n 2 n 2n 次操作&#xf…

小智AI -- ESP32-S3 DIY面包板WIFI-LCD彩屏

DIY 所需硬件 开发板&#xff1a;ESP32-S3-DevKitC-1&#xff08;选择 WROOM N16R8 模组&#xff09; Goouuu ESP32-S3-N16R8开发板数字麦克风&#xff1a;INMP441 INMP441全向麦克风模块功放&#xff1a;MAX98357A MAX98357 I2S 音频放大器模块腔体喇叭&#xff1a;8Ω 2~3W 或…

家用网络进行DNS优选

家用网络进行DNS优选的好处主要体现在以下几个方面&#xff1a; 提升网络访问速度&#xff1a; DNS优选通过选择响应时间更快的DNS服务器&#xff0c;减少域名解析的延迟&#xff0c;从而加快网页加载和应用访问速度。尤其在访问国内外网站时&#xff0c;选择合适的DNS服务器可…

刷题 | 牛客 - js中等题-下 (更ing)45/54知识点解答

JS45 数组去重 描述 为 Array 对象添加一个去除重复项的方法 示例1 输入&#xff1a; [false, true, undefined, null, NaN, 0, 1, {}, {}, a, a, NaN] 复制输出&#xff1a; [false, true, undefined, null, NaN, 0, 1, {}, {}, a] Array.prototype.uniq function () …

vue3使用krpano1.22

官方文档链接 https://krpano.com/docu/js/#top 例子 https://krpano.com/releases/1.22/viewer/examples/javascript-interface/js-api-examples.html https://krpano.com/viewsource.html?releases/1.22/viewer/examples/javascript-interface/js-api-examples.html 注…

2025年AI面试推荐榜单,数字化招聘转型优选

一、AI面试为何成为2025招聘标配&#xff1f; 2025年企业对AI面试的需求从“效率工具”升级为“战略级招聘伙伴”。数据显示&#xff0c;超7成企业计划年内全面引入AI面试&#xff0c;其中技术岗、全球化招聘及蓝领用工场景需求增速显著。以下以综合技术实力、行业口碑及落地能…

人机协作新篇章:艾利特按摩机器人如何重塑健康生活

引言&#xff1a;按摩机器人的需求爆发 在快节奏的现代生活中&#xff0c;亚健康人群比例持续攀升。据《全球健康产业白皮书》显示&#xff1a; 85%的都市人群存在肌肉劳损问题专业理疗师供需缺口达1&#xff1a;3200精准按摩服务成本年均增长18% 这一背景下&#xff0c;按摩…

从代码学习深度学习 - 情感分析:使用循环神经网络 PyTorch版

文章目录 前言1. 加载与预处理数据集数据读取与词元化构建词汇表截断、填充与数据迭代器2. 构建循环神经网络模型双向RNN模型(BiRNN)详解权重初始化3. 加载预训练词向量构建词向量加载器将预训练向量注入模型4. 训练与评估模型定义训练函数可视化训练过程5. 模型预测编写预测…

化于无形的 lambda 语法

针对数据集合的每个成员进行计算是很常见的任务&#xff0c;用循环语句当然能实现&#xff0c;但比较麻烦&#xff0c;算个简单的求和都要写很多句代码。 编程语言经常把这些运算封装成函数&#xff0c;比如 Python 的 sum 函数&#xff0c;求订单价格总和是这样写的&#xff…

day42

1. 回调函数&#xff1a;把一个函数当成“任务清单”交给另一个函数&#xff0c;等后者干完活&#xff0c;就按清单执行这个函数。比如点外卖后留电话&#xff0c;骑手送到了就打电话&#xff08;执行回调&#xff09;通知你。 2. lambda函数&#xff1a;临时写的超短函数&…

百度日志中台前端重构实践

日志中台是百度内部针对打点数据的全生命周期管理平台&#xff0c;作为公司日志数据的唯一入口&#xff0c;承担以下核心职能&#xff1a;1.功能覆盖&#xff1a;提供从数据采集、传输、存储到查询分析的一站式服务&#xff0c;支持产品运营分析、研发性能监控、运维管理等多元…

資訊安全 (Information Security)3大 “CIA“要素

資訊安全之3大要素&#xff0c;業界慣用"CIA"稱之&#xff0c;包括機密性 (Confidentiality)、完整性(Integrity)與可用性(Availability)&#xff1b;更應增加諸如鑑別性、可歸責性、不可否認性與可靠性。 1.機密性 (Confidentiality) 機密性是指採用適當的安全機制…

php后台增加权限控制

背景 最近在对接某大厂&#xff0c;部署差不多了&#xff0c;但是在漏洞扫描环节有问题&#xff0c;前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问&#xff0c;很危险 解决方法 一、创建 Auth 中间件 首先创建一个专门…

跨平台后端编程ASP.NET CORE Razor新一代Web开发框架C#

asp.net core Razor动态语言编程代替asp.net .aspx更高级吗&#xff1f; https://blog.csdn.net/xiaoyao961/article/details/148846065 C#Blazor应用-跨平台WEB开发VB.NET-CSDN博客 https://blog.csdn.net/xiaoyao961/article/details/148846437 Products.razor文件,Blazor和…

Storm-Pulse 全国强对流预报接口深度解析:从技术原理到防灾应用(附API接入示例)

2025年6月14日安徽省气象台发布的强对流黄色预警中&#xff0c;合肥、阜阳等地出现了小时雨量 30-50 毫米的短时强降水和8-10级雷暴大风&#xff0c;局地甚至观测到云闪现象。强对流天气是指由强烈上升气流引发的突发性、高破坏力天气现象&#xff0c;涵盖了短时强降水、雷暴大…

2024中国科学技术大学计算机保研上机真题

中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem 运动会比赛日程安排 题目描述 某运动会设立 M M M 个比赛项目&#xff0c;每个运动员&#xff08;共 N N N 个运动员&#xff09;可以参加多个项目&#xff0c;每个项目的比赛时长…

(LeetCode 面试经典 150 题) 122. 买卖股票的最佳时机 II (贪心)

题目&#xff1a;122. 买卖股票的最佳时机 II 思路&#xff1a;贪心&#xff0c;时间复杂度0(n)。 当天比前一天值大&#xff0c;就进行卖出的交易。购入是默认前一天已购入。 C版本&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int…

一篇文章了解XML

一、什么是 XML&#xff1f; XML 是一种结构化数据的标记语言&#xff0c;用来存储、传输和描述数据。 它和 HTML 很像&#xff0c;但它的标签是自定义的&#xff0c;不限定格式和外观&#xff0c;而是强调数据的结构和含义。 XML不是用来展示数据的&#xff0c;HTML是用来展…