概述
Flink是一个用于对无界和有界数据流进行有状态计算的框架。Flink在不同的抽象级别提供多个API,并为常见用例提供专用库。
流媒体应用程序的构建块
可以由流处理框架构建和执行的应用程序类型由框架控制流,状态和时间的程度来定义。在下文中,我们描述了流处理应用程序的这些构建块,并解释了Flink处理它们的方法。
流
显然,流是流处理的一个基本方面。但是,流可以具有不同的特征,这些特征会影响流的处理方式。Flink是一个多功能的处理框架,可以处理任何类型的流。
有界和无界流:流可以是无界的或有界的,即固定大小的数据集。Flink具有处理无界流的复杂功能,但也有专门的运营商来有效地处理有界流。
实时和记录的流:所有数据都作为流生成。有两种方法可以处理数据。在生成时实时处理它或将流持久保存到存储系统(例如,文件系统或对象存储库),并在以后处理它。Flink应用程序可以处理记录或实时流。
状态
每个重要的流应用程序都是有状态的,即只有对单个事件应用转换的应用程序才需要状态。运行基本业务逻辑的任何应用程序都需要记住事件或中间结果,以便在以后的时间点访问它们,例如在收到下一个事件时或在特定持续时间之后。
我们可以通过查看Flink在状态处理环境中提供的所有功能来查看应用程序状态。
多状态基元:Flink为不同的数据结构提供状态基元,例如原子值,列表或映射。开发人员可以根据函数的访问模式选择最有效的状态原语。
可插拔状态后端:应用程序状态由可插拔状态后端管理和检查点。Flink具有不同的状态后端,可以在内存或RocksDB中存储状态,RocksDB是一种高效的嵌入式磁盘数据存储。也可以插入自定义状态后端。
完全一次的状态一致性:Flink的检查点和恢复算法可确保在发生故障时应用程序状态的一致性。因此,故障是透明处理的,不会影响应用程序的正确性。
非常大的状态:由于其异步和增量检查点算法,Flink能够维持几兆兆字节的应用程序状态。
可扩展的应用程序:Flink通过将状态重新分配给更多或更少的工作人员来支持有状态应用程序的扩展。
时间
时间是流应用程序的另一个重要组成部分 大多数事件流都具有固有的时间语义,因为每个事件都是在特定时间点生成的。此外,许多常见的流计算基于时间,例如窗口聚合,会话化,模式检测和基于时间的连接。流处理的一个重要方面是应用程序如何测量时间,即事件时间和处理时间的差异。
Flink提供了一组丰富的与时间相关的功能
Event-time Mode:使用事件时间语义处理流的应用程序根据事件的时间戳计算结果。因此,无论是否处理记录的或实时的事件,事件时间处理都允许准确和一致的结果。
支持Watermark:Flink使用水印来推断事件时间应用中的时间。水印也是一种灵活的机制,可以权衡结果的延迟和完整性。
延迟数据处理:当使用水印在事件 - 时间模式下处理流时,可能会在所有相关事件到达之前完成计算。这类事件被称为迟发事件。Flink具有多个选项来处理延迟事件,例如 过侧输出重新路由它们以及更新以前完成的结果。
处理时间模式:除了事件时间模式之外,Flink还支持处理时间语义,该处理时间语义执行由处理机器的挂钟时间触发的计算。处理时间模式适用于具有严格的低延迟要求的某些应用,这些要求可以容忍近似结果。