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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: 快速学习 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轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
10天前
|
SQL 消息中间件 关系型数据库
Apache Doris Flink Connector 24.0.0 版本正式发布
该版本新增了对 Flink 1.20 的支持,并支持通过 Arrow Flight SQL 高速读取 Doris 中数据。
|
24天前
|
消息中间件 监控 数据挖掘
基于RabbitMQ与Apache Flink构建实时分析系统
【8月更文第28天】本文将介绍如何利用RabbitMQ作为数据源,结合Apache Flink进行实时数据分析。我们将构建一个简单的实时分析系统,该系统能够接收来自不同来源的数据,对数据进行实时处理,并将结果输出到另一个队列或存储系统中。
91 2
|
26天前
|
消息中间件 运维 Kafka
Apache Flink 实践问题之达到网卡的最大速度如何解决
Apache Flink 实践问题之达到网卡的最大速度如何解决
34 2
|
1天前
|
消息中间件 资源调度 API
Apache Flink 流批融合技术介绍
本文源自阿里云高级研发工程师周云峰在Apache Asia Community OverCode 2024的分享,内容涵盖从“流批一体”到“流批融合”的演进、技术解决方案及社区进展。流批一体已在API、算子和引擎层面实现统一,但用户仍需手动配置作业模式。流批融合旨在通过动态调整优化策略,自动适应不同场景需求。文章详细介绍了如何通过量化指标(如isProcessingBacklog和isInsertOnly)实现这一目标,并展示了针对不同场景的具体优化措施。此外,还概述了社区当前进展及未来规划,包括将优化方案推向Flink社区、动态调整算子流程结构等。
138 31
Apache Flink 流批融合技术介绍
|
26天前
|
数据采集 分布式计算 Kubernetes
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
Apache Flink 实践问题之ZooKeeper 网络瞬断时如何解决
39 4
|
20天前
|
Java 微服务 Spring
驾驭复杂性:Spring Cloud在微服务构建中的决胜法则
【8月更文挑战第31天】Spring Cloud是在Spring Framework基础上打造的微服务解决方案,提供服务发现、配置管理、消息路由等功能,适用于构建复杂的微服务架构。本文介绍如何利用Spring Cloud搭建微服务,包括Eureka服务发现、Config Server配置管理和Zuul API网关等组件的配置与使用。通过Spring Cloud,可实现快速开发、自动化配置,并提升系统的伸缩性和容错性,尽管仍需面对分布式事务等挑战,但其强大的社区支持有助于解决问题。
32 0
|
26天前
|
消息中间件 Java 数据处理
揭秘Apache Flink的Exactly-Once神技:如何在数据流海中确保每条信息精准无误,不丢不重?
【8月更文挑战第26天】Apache Flink 是一款先进的流处理框架,其核心特性 Exactly-Once 语义保证了数据处理的精准无误。尤其在金融及电商等高要求场景下,该特性极为关键。本文深入解析 Flink 如何实现 Exactly-Once 语义:通过状态管理确保中间结果可靠存储;利用一致的检查点机制定期保存状态快照;以及通过精确的状态恢复避免数据重复处理或丢失。最后,提供一个 Java 示例,展示如何计算用户访问次数,并确保 Exactly-Once 语义的应用。
43 0
|
2月前
|
存储 监控 大数据
阿里云实时计算Flink在多行业的应用和实践
本文整理自 Flink Forward Asia 2023 中闭门会的分享。主要分享实时计算在各行业的应用实践,对回归实时计算的重点场景进行介绍以及企业如何使用实时计算技术,并且提供一些在技术架构上的参考建议。
705 7
阿里云实时计算Flink在多行业的应用和实践
|
1月前
|
SQL 消息中间件 Kafka
实时计算 Flink版产品使用问题之如何在EMR-Flink的Flink SOL中针对source表单独设置并行度
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
26天前
|
消息中间件 监控 Kafka
联通实时计算平台问题之Flink状态后端数据量较大时,问题排查要如何进行
联通实时计算平台问题之Flink状态后端数据量较大时,问题排查要如何进行

推荐镜像

更多