Flink入门-应用

Apache Flink 是一个针对无界和有界数据流进行有状态计算的框架。Flink自低向上在不同的抽象级别提供API,并且针对常见的使用场景开发了专门的扩展库。
在本篇博客中主要Flink中提供的简单易用的,易于表达的API和库
流处理应用的基本组件
可以由流处理框架构建和执行的应用程序类型是由框架对流、状态、时间的支持程度来决定的。在下文中我们将对上述这些流处理应用的节本组件逐一进行细致剖析。

显而易见(数据)流是流处理的基本要素。然而,流也拥有这多中特性。这些特性决定了流如何及合适被处理。Flink是一个能够处理任何类型流的强大处理框架。
有界和无界 的数据流:流可以是无界的;也可以是有界的。例如固定大小的数据集。Flink在无界的数据流处理上拥有诸多功能强大的特点,同时也针对有界数据流开发了专门的高效算子。
实时和历史记录的数据流:所有的数据都是以流的方式产生,但用户通常会使用两种截然不同的方法处理数据。或是在数据生成时进行实时的处理。亦或是先将数据流持久化到存储系统中–例如文件系统或对象存储,然后再进行批处理。Flink的应用能能够同时支持处理实时以及历史记录数据流。
状态
只有在每一个单独的事件上进行转换操作的应用才不需要状态,换言之,每个具有一定复杂度的流处理应用都是有状态的。任何运行基本业务逻辑的流处理应用都需要在一定时间内存储所接收的事件或中间结果,以供后续的某个时间点(例如收到下一个事件或者经过一段特定时间)进行访问并进行后续处理。
在这里插入图片描述
应用状态是Flink中的一等公民,Flink提供了许多状态管理相关的特性支持,其中包括:
--多中状态基础类型:Flink为多种不同的数据结构提供了想对应的状态基础类型,例如原子值(value)列表(list)以及映射(map)。开发者可以基于处理函数对状态的访问方式,选择最高效、最适合的状态基础类型。
插件化的State Backend:State Backend负责管理应用程序状态,并在需要的时候进行checkpoint。Flink支持多种State backend,可以将状态在内存或者RocksDB。RocksDB是一种高效的嵌入式,持久化键值存储引擎。Flink也支持插件式的自定义state backend进行状态存储。
精确一次语义: Flink的checkponit和故障恢复算法保证了故障发生后应用状态的一致性。因此Flink能够在应用程序发生故障时,对应用程序透明,不造成正确性的影响。
可弹性伸缩的应用:Flink能够通过在更多或更少的工作节点上对状态进行重新分布,支持有状态应用的分布式的横向伸缩。
时间
时间是流处理应用另一个重要的组成部分。因为事件总是在特定的时间点发生,所以大多数的事件流都拥有事件本身所固有的时间语义。进一步而言,许多常见的流计算都基于时间语义,例如窗口聚合、回话计算、模式检测和基于时间的join。流处理的一个重要方面是应用程序如何衡量时间。即区分事件时间(event-time)和处理时间(process time)
Flink提供了丰富的时间语义支持。
事件时间模式:使用事件时间语义的流处理应用根据事件本身自带的时间戳进行结果的计算。因此,无论处理的是历史记录的事件还是实时的事件,事件时间模式的处理总能保证结果的准确性的一致性。
Watermark支持:Flink引入了watermark的概念,用以衡量事件时间进展。Watermark也是一种平衡处理演示和完整性的灵活机制。
迟到数据处理:当以带有watermark的事件时间模式处理数据流时,在计算完成之后仍会有相关数据到达。这样的事件被称为迟到事件。Flink提供了多种处理迟到数据的选项。例如将这些数据重定向到旁路输出(side output)或者更新之前完成计算的结果。
处理时间模式:处理事件时间模式,Flink还支持处理时间语义。处理时间模式根据处理引擎的机器始终出发计算,一般适用于有着严格的低延迟要求,并且能够容忍近似结果的流处理应用。
分层API
Flink根据抽象程度分层,提供了三种不同的API。每一种API在简洁性和表达力上有着不同的侧重,并且针对不同的应用场景。

在这里插入图片描述
Process Function是Flink所提供的最具表达力的接口。Processfunction可以处理一或两条输入数据流中的单个事件或者归入一个特定窗口内的多个事件。他提供了对于时间和状态的细粒度控制。开发者可以在其中任意地修改状态,也能够注册定时器用以在未来的某一时刻出发回调函数。因此,你可以利用processfunction实现许多有状态的事件驱动应用所需要的基于单个事件的复杂业务逻辑。
下面的代码示例展示了如何在keyedStream上利用keyedProcessFunction对标记为START和END的事件进行处理。当收到START事件时,处理函数会记录其时间戳,并且注册一个时长4小时的计时器。如果在计时器结束之前收到END事件,处理函数会计算其与上一个START事件的时间间隔,清空状态并将结算结果。否则,计时器结束,并清空状态。

发布了434 篇原创文章 · 获赞 58 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/ppwwp/article/details/104138409