Stream Processing with Apache Flink | 学习笔记(五)

简介: 快速学习 Stream Processing with Apache Flink

开发者学堂课程【开源 Flink 极客训练营Stream Processing with Apache Flink】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/760/detail/13338


Stream Processing with Apache Flink


1、时间相关 API

目标  Event Time   Processing Time

获取记录事件 context.getTimestamp()或从数据字段中获取 timerService().currentProcessingTime()

获取“watermark” timerService().currentWatermark()

timerService().currentProcessingTime()

注册定时器 timerService.registerEventTimeTimer()

timerService.registerProcessingTimeTimer

图片9.png

在编写逻辑的过程中所用到的时间相关的 API ,还是按照 Event Time 还有 Processing Time 进行区分。在应用逻辑里通过接口对应的支持,可以做三件事,第一件事是获取记录的时间来,可以调context.getTimestamp 或者如果是 SQL、Table 会直接从数据字段中把对应的时间提取出来, Processing Time 是直接掉currentProcessingTime 就可以,service 的内部是直接调用从获取系统时间的静态方法来返回值,除了获取记录的时间,还需要获取watermark ,把 watermark 加引号,因为只有Event Time 里才有 watermark 的概念,而 Processing Time 里没有 watermark概念,如果非要把一个东西当成 watermark,就是本身数据时间,比如第一次调用 timerservice.current Processing Time 方法之后获取一个值,既是当前记录的时间也是当前的 watermark 值,因为时间往前流,第一次调用值之后,第二次调用值不会比第一次值还小。第三个是可以在一些相关的方法里去注册一些定时器,作用是可以比如有一个 cache,对于 cache 在今后的某一个时间进行类似于清理或者其他的工作,清理应该发生在将来的某一个时间点,可以调用timerservice.registerEvent Time Timer 或者 Processing Time Timer 方法注册定时器之后,要在整个的方法里去添加对于定时器回调的处理逻辑,每当对应的流程 Event Time 或者 Processing Time 的时间超过定时器时间之后,就会调用方法里去自己编写的定时器回调逻辑,可以把对于 cache 的清理或者一些其他的工作放到逻辑里面去完成。

例子:

/**

* 7. Processing time tumbling window.

*/

public static void presessingTinchindew() throws Exception {

StreamExecutionEnviromment e=StreamExecutionEnvirormen t.getExecutionEnvironment();

DataStreamSourcesInteger> source =e

.add5ourcelnew 5ourceFunction-Integer>(){

private volatile boolean stop = false;

@Override

public void runlSourceContext ctx]throws Exception {

int1=8;

white (1stop 5& 1 < data.size()) {

ctx.collect(data.get(i++));

Thread.sleep(200);

}

}

@Override

public void cancell) { stop =true; }

}).setParallelism(1);

e.setStreanTineCharacteristic(TineCharacteristic.ProcessingTime);source.keyBy(wv2).processnewKeyedProcessFunction(){

private static final int wINDOwSIZE= 200;

private TreeMapcLong,Integerwindows;

@Override

public void open(Configaration parameters)throws Exception{

super.open(paraneters);

windows=new TreeMap-o();

@Override

public void processElement(Integer valve, Context ctx, Collector out] {

Long currentTime =ctx.timerServicel).currentProcessingTime(); long windowstart =currentTime / WINDOWSIZE;

// Update the window

int sum= windows.getOrDefault(windowStart,0)

windows.put(windowstart,sum+value);

// Fire old windows

Mapoldwindows=windows.headMap(windowStart;false);

Iterator

out.collect(iterator.next().getValue());

iterator.remove();

}

}

@Override

public void close() throws Exception {

super.close();

Systen.out.println(windows);

}

}).print().setParallelism(2);

e.execute();

}

自己定义 tubling window 翻滚的的窗口,窗口和窗口之间没有重合,是基于 Processing Time 完成,第一步是获取运行环境,然后新添加数据的源,没有直接用刚才定的 data 集合里去取数据,因为涉及到时间,所以为了看出来效果,需要在数据注入的过程当中人为的去引入一些延迟,基本的逻辑是遍历 data 的集合里边获取数据,每一次获取数据之后,都引入了200毫秒的延迟,这是简单的 Source Function,如果要用 Processing Time 要注意在环境里设置时间特性, process 是默认的特性。 Processing Time 是一行可有可无,但是为了表示效果把它加上,如果要用 Event Time 一定要把时间特性设置,设置成为 Event Time ,设置完了之后要从 Source Function 出发来进行。首先进行按照奇偶数字进行分组,同样定义一个 keyed process function,具体在 Keyed process function 第一步是为了把它和状态区分开,这里没有用系统内部 Flink 里状态的方法,直接简单使用 treemap 存储所有的温度,温度的 size 设成200毫米,在 open 方法里首先对于 treemap 用来存取不同窗口里时间。存取不同的窗口里的数值的数据结构进行一个初始化,初始化之后每到一条数据,首先通过调用ctx.timerService.currentProcessingTime 获取当前的时间,获取时间之后,要对数据进行窗口的划分,划分用窗口的开始时间作为窗口唯一的标识进行划分,直接把当前的时间去除以窗口的大小,取证,可以得到窗口的开始时间。要对数据窗口里的数据进行 sum 操作,获取窗口现有的 sum 值之后,可以 treemap.getOrDefault 的方法,如果窗口里的值已经存在,就会返回已有的 sum 值,如果没有存在就回去。返回之后需要更新窗口里的数值,可以把新计算的结果退回去,回去之后还要进行一些判断,没有用到 timer 直接去在处理的逻辑里判断,把所有的小于窗口、旧的窗口拿出来去遍历旧的窗口,因为旧窗口里有的值肯定不会再更新,遍历一下值然后把结果发送出去,发送出去之后旧的窗口没有用了,直接删除。最后 close方法在整个处理完成之后会自动调用方法,在里边为了防止没有来得及触发的窗口的数值看不到,就把所有剩下的窗口里面剩下的值都输出来,最后把结果用 print 方法打印到控制台上把并行度设置为2。

执行一下结果为:

/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/bin/Java...

2>1

1>2

2>3

1>4

2>5

1>6

2>7

1>8

2>9

{}

{}

{}

{7969896895=10}

Process finished with exit code 0

窗口的数据源每发送一条数据都加上200毫秒的间隔,窗口大小也是200毫秒,所以基本上每过来一条数据会触发一个新的窗口。

把200毫秒改成400毫秒,演示结果:

/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home/bin/Java...

2>3

1>7

2>11

1>15

{3984948598=19}

{}

{}

{}

Process finished with exit code 0

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
相关文章
|
2月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
442 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
343 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
4月前
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
597 9
Apache Flink:从实时数据分析到实时AI
|
4月前
|
SQL 人工智能 API
Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
Apache Flink 2.1.0 正式发布,标志着实时数据处理引擎向统一 Data + AI 平台迈进。新版本强化了实时 AI 能力,支持通过 Flink SQL 和 Table API 创建及调用 AI 模型,新增 Model DDL、ML_PREDICT 表值函数等功能,实现端到端的实时 AI 工作流。同时增强了 Flink SQL 的流处理能力,引入 Process Table Functions(PTFs)、Variant 数据类型,优化流式 Join 及状态管理,显著提升作业稳定性与资源利用率。
539 0
|
3月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
1315 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
4月前
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
500 6
|
4月前
|
消息中间件 存储 Kafka
Apache Flink错误处理实战手册:2年生产环境调试经验总结
本文由 Ververica 客户成功经理 Naci Simsek 撰写,基于其在多个行业 Flink 项目中的实战经验,总结了 Apache Flink 生产环境中常见的三大典型问题及其解决方案。内容涵盖 Kafka 连接器迁移导致的状态管理问题、任务槽负载不均问题以及 Kryo 序列化引发的性能陷阱,旨在帮助企业开发者避免常见误区,提升实时流处理系统的稳定性与性能。
435 0
Apache Flink错误处理实战手册:2年生产环境调试经验总结
|
4月前
|
存储 分布式计算 数据处理
「48小时极速反馈」阿里云实时计算Flink广招天下英雄
阿里云实时计算Flink团队,全球领先的流计算引擎缔造者,支撑双11万亿级数据处理,推动Apache Flink技术发展。现招募Flink执行引擎、存储引擎、数据通道、平台管控及产品经理人才,地点覆盖北京、杭州、上海。技术深度参与开源核心,打造企业级实时计算解决方案,助力全球企业实现毫秒洞察。
520 0
「48小时极速反馈」阿里云实时计算Flink广招天下英雄
|
运维 数据处理 数据安全/隐私保护
阿里云实时计算Flink版测评报告
该测评报告详细介绍了阿里云实时计算Flink版在用户行为分析与标签画像中的应用实践,展示了其毫秒级的数据处理能力和高效的开发流程。报告还全面评测了该服务在稳定性、性能、开发运维及安全性方面的卓越表现,并对比自建Flink集群的优势。最后,报告评估了其成本效益,强调了其灵活扩展性和高投资回报率,适合各类实时数据处理需求。

推荐镜像

更多