首页/新闻资讯/正文详情

StreamTask数据流:StreamTask能力概述、Flink处理网络数据逻辑

发布时间:2026/11/3 18:17:57 来源:云帆数科 栏目:资讯中心
StreamTask数据流:StreamTask能力概述、Flink处理网络数据逻辑
文章目录一. StreamTask核心组件与能力二. OneInputStreamTask接入网络数据并处理三. 处理数据1. StreamElement类别2. 业务数据处理逻辑四. 小结先来看数据是如何经过网络写入下游Task节点并通过算子进行处理的这里以OneInputStreamTask为例进行说明。一. StreamTask核心组件与能力如代码OneInputStreamTask.init()方法包含了初始化StreamTask主要核心组件的逻辑。OneInputStreamTaskpublicvoidinit()throwsException{StreamConfigconfigurationgetConfiguration();intnumberOfInputsconfiguration.getNumberOfInputs();if(numberOfInputs0){// 创建CheckpointedInputGateCheckpointedInputGateinputGatecreateCheckpointedInputGate();TaskIOMetricGrouptaskIOMetricGroupgetEnvironment().getMetricGroup().getIOMetricGroup();taskIOMetricGroup.gauge(checkpointAlignmentTime,inputGate::getAlignmentDurationNanos);// 创建DataOutput组件DataOutputINoutputcreateDataOutput();StreamTaskInputINinputcreateTaskInput(inputGate,output);// 创建StreamOneInputProcessorinputProcessornewStreamOneInputProcessor(input,output,getCheckpointLock(),operatorChain);}headOperator.getMetricGroup().gauge(MetricNames.IO_CURRENT_INPUT_WATERMARK,this.inputWatermarkGauge);getEnvironment().getMetricGroup().gauge(MetricNames.IO_CURRENT_INPUT_WATERMARK,this.inputWatermarkGauge::getValue);创建CheckpointedInputGateCheckpointedInputGate是对InputGate进行封装实现对CheckpointBarrier对齐的功能。此组件可以接入上游Task实例写入指定InputChannel中的Buffer数据。创建DataOutput组件在StreamTaskInput中会将接入的数据 通过DataOutput组件输出到算子链的HeaderOperator中。创建StreamTaskInput组件用于接收数据将InputGate和DataOutput作为内部成员完成对数据的接入和输出。创建StreamOneInputProcessor数据处理器此组件会被Task线程模型调度并执行实现周期性地从StreamTaskInput组件中读取数据元素并处理。小结OneInputStreamTask初始化过程中包括创建StreamTaskInput和DataOutput组件。接下来了解StreamTask如何利用StreamTaskInput和DataOutput完成数据元素的接收并发送到算子链中进行处理。二. OneInputStreamTask接入网络数据并处理StreamTask.processInput()方法定义了处理数据的主要流程。数据最终会通过MailboxProcessor调度与执行调用StreamOneInputProcessor.processInput()方法完成数据元素的获取和处理调度StreamOneInputProcessor组件串联并运行StreamTaskInput组件、DataOutput组件和OperatorChain组件最终完成数据元素的处理操作。StreamTask.processInput()protectedvoidprocessInput(MailboxDefaultAction.Controllercontroller)throwsException{InputStatusstatusinputProcessor.processInput();// 上游如果还有数据则继续等待执行if(statusInputStatus.MORE_AVAILABLErecordWriter.isAvailable()){return;}// 上游如果没有数据则发送控制消息到控制器if(statusInputStatus.END_OF_INPUT){controller.allActionsCompleted();return;}CompletableFuture?jointFuturegetInputOutputJointFuture(status);MailboxDefaultAction.SuspensionsuspendedDefaultActioncontroller.suspendDefaultAction();jointFuture.thenRun(suspendedDefaultAction::resume);}接下来详细看StreamOneInputProcessor.processInput()emitNext()通过StreamTaskNetworkInput接收数据元素并返回InputStatus判断数据元素是否全部消费完毕。emitNext()会将DataOutput作为参数传递到方法内部用于将数据元素输出到算子链中。publicInputStatusprocessInput()throwsException{InputStatusstatusinput.emitNext(output);if(statusInputStatus.END_OF_INPUT){synchronized(lock){operatorChain.endHeadOperatorInput(1);}}returnstatus;}StreamTaskNetworkInput.emitNext()处理数据逻辑。//BufferOrEvent代表数据元素可以是Buffer类型也可以是事件类型//比如CheckpointBarrier、TaskEvent等事件。publicInputStatusemitNext(DataOutputToutput)throwsException{while(true){// 从Deserializer中获取数据元素if(currentRecordDeserializer!null){DeserializationResultresultcurrentRecordDeserializer.getNextRecord(deserializationDelegate);// 如果DeserializationResult对应的Buffer数据已经被消费则回收Bufferif(result.isBufferConsumed()){currentRecordDeserializer.getCurrentBuffer().recycleBuffer();currentRecordDeserializernull;}// 如果result是完整的数据元素则调用processElement()方法进行处理if(result.isFullRecord()){processElement(deserializationDelegate.getInstance(),output);returnInputStatus.MORE_AVAILABLE;}}// 从checkpointedInputGate中拉取数据//如果bufferOrEvent为空则判断checkpointedInputGate是否已经关闭如果已经关闭了则直接返回END_OF_INPUT状态否则返回NOTHING_AVAILABLE状态。OptionalBufferOrEventbufferOrEventcheckpointedInputGate.pollNext();// 如果有数据则调用processBufferOrEvent()方法进行处理if(bufferOrEvent.isPresent()){processBufferOrEvent(bufferOrEvent.get());}else{// 如果checkpointedInputGate已关闭则返回END_OF_INPUTif(checkpointedInputGate.isFinished()){checkState(checkpointedInputGate.getAvailableFuture().isDone(),Finished BarrierHandler should be available);if(!checkpointedInputGate.isEmpty()){thrownewIllegalStateException(Trailing data in checkpoint barrier handler.);}returnInputStatus.END_OF_INPUT;}returnInputStatus.NOTHING_AVAILABLE;}}}三. 处理数据1. StreamElement类别StreamElement具体类别有StreamRecord、StreamStatus以及Watermark其中StreamRecord就是需要处理的业务数据Watermark则是上游传递下来的Watermark事件。//StreamTaskNetworkInput.processElement()privatevoidprocessElement(StreamElementrecordOrMark,DataOutputToutput)throwsException{// StreamRecord类型if(recordOrMark.isRecord()){output.emitRecord(recordOrMark.asRecord());// Watermark类型}elseif(recordOrMark.isWatermark()){statusWatermarkValve.inputWatermark(recordOrMark.asWatermark(),lastChannel);// LatencyMarker类型}elseif(recordOrMark.isLatencyMarker()){output.emitLatencyMarker(recordOrMark.asLatencyMarker());// StreamStatus类型}elseif(recordOrMark.isStreamStatus()){statusWatermarkValve.inputStreamStatus(recordOrMark.asStreamStatus(),lastChannel);}else{thrownewUnsupportedOperationException(Unknown type of StreamElement);}}2. 业务数据处理逻辑对于业务数据调用output.emitRecord(recordOrMark.asRecord())方法进行数据元素的输出操作然后通过DataOutput输出到算子链中进行处理。如下方法调用operator处理实际就是在创建StreamTaskNetworkOutput时指定的算子链HeaderOperator。OneInputStreamTask.StreamTaskNetworkOutput.emitRecord()publicvoidemitRecord(StreamRecordINrecord)throwsException{synchronized(lock){//累加器计算消费数量numRecordsIn.inc();//通过算子链处理operator.setKeyContextElement1(record);operator.processElement(record);}}四. 小结Flink从InputGate中拉取数据元素并进行反序列化操作转换成StreamElement类型后再调用StreamTaskNetworkOutput.emitRecord()方法将数据元素推送到OperatorChain的HeaderOperator中进行处理。《Flink设计与实现核心原理与源码解析》 – 张利兵

相关推荐

LTX-LoRAs工作流配置详解:ComfyUI节点连接与参数优化指南
LTX-LoRAs工作流配置详解:ComfyUI节点连接与参数优化指南

LTX-LoRAs工作流配置详解:ComfyUI节点连接与参数优化指南 【免费下载链接】LTX-LoRAs 项目地址: https://ai.gitcode.com/hf_mirrors/Alissonerdx/LTX-LoRAs LTX-LoRAs 是一套专为LTX 2.3视频生成模型设计的LoRA微调模型集合,通过ComfyUI工作流配… · 2026/11/3 18:17:57

Qwen3-Omni-30B-A3B-Instruct智能健身房:会员音视频运动分析与指导
Qwen3-Omni-30B-A3B-Instruct智能健身房:会员音视频运动分析与指导

Qwen3-Omni-30B-A3B-Instruct智能健身房:会员音视频运动分析与指导 【免费下载链接】Qwen3-Omni-30B-A3B-Instruct Qwen3-Omni是多语言全模态模型,原生支持文本、图像、音视频输入,并实时生成语音。 项目地址: https://ai.gitcode.com/hf_m… · 2026/11/3 18:17:57

WorldMirror 2.0实战教程:从照片/视频到3D点云重建的完整流程
WorldMirror 2.0实战教程:从照片/视频到3D点云重建的完整流程

WorldMirror 2.0实战教程:从照片/视频到3D点云重建的完整流程 想要将普通照片或视频快速转换为高质量3D点云模型吗?WorldMirror 2.0作为腾讯混元团队的3D世界重建模型,提供了一套完整的端到端解决方案。本文将为你详细介绍这个强大的3D点云重… · 2026/11/3 18:17:57

Minke如何自动发现并启动本地模型:model-runtime对LM Studio与Ollama的生命周期设计深挖
Minke如何自动发现并启动本地模型:model-runtime对LM Studio与Ollama的生命周期设计深挖

【免费下载链接】Minke 🐳 DeepSeek Harness Desktop 项目地址: https://gitcode.com/gh_mirrors/mink/Minke 点击查看 免费下载 Minke 是一款基于 DeepSeek Harness 的桌面 AI 开发工具,内置的 model-runtime 模块能自动发现并启动本机的 L… · 2026/11/3 19:01:01

C# 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)
C# 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。问题:已知抛物线方程的系数,求其顶点、焦点和准线。平面上由若干点构成的曲线,使得曲线上任意一点到焦点的距离相等,则该点构成的曲… · 2026/11/3 19:01:01

天气接口为什么重要:从终端服务到行业气象应用的连接方式
天气接口为什么重要:从终端服务到行业气象应用的连接方式

在手机天气、旅游规划、无人机作业、智能空调和赛事保障等场景中,用户看到的往往只是一个温度或降雨提示,背后却涉及数据采集、预报模型、接口调用、风险识别和业务决策等多个环节。对于企业来说,天气接口不仅是“获取天气数据”的工具&#… · 2026/11/3 19:01:01

HarmonyOS API 26 Navigation 异步替换:replaceDestination、错误码与失败留栈
HarmonyOS API 26 Navigation 异步替换:replaceDestination、错误码与失败留栈

HarmonyOS API 26 Navigation 异步替换:replaceDestination、错误码与失败留栈replaceDestination 的价值不只是返回 Promise,而是让调用方有机会区分“请求已发出”和“页面确实可用”。工程治理要围绕成功提交点、错误分类、失败留栈和重复操作展开。一… · 2026/11/3 19:01:01

C++ 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)
C++ 求抛物线的顶点、焦点和准线(Finding the vertex, focus and directrix of a parabola)

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。问题:已知抛物线方程的系数,求其顶点、焦点和准线。平面上由若干点构成的曲线,使得曲线上任意一点到焦点的距离相等,则该点构成的曲… · 2026/11/3 19:01:01

Ventoy 持久化教程:一次建好 persistence.dat,U盘 Linux 数据跟着走
Ventoy 持久化教程:一次建好 persistence.dat,U盘 Linux 数据跟着走

Ventoy 持久化教程:一次建好 persistence.dat,U盘 Linux 数据跟着走 【免费下载链接】Ventoy A new bootable USB solution. 项目地址: https://gitcode.com/GitHub_Trending/ve/Ventoy Ventoy 持久化解决的烦恼很具体:从 U 盘启动的 … · 2026/11/3 18:59:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码