Apache Flink是用于无限制和有限制的数据流上的有状态计算的框架。Flink在不同的抽象级别上提供了多个API,并为常见用例提供了专用的库。
流应用程序的构建块
1)流
- 有界和无界流:流可以是无界或有界的,即固定大小的数据集。Flink具有复杂的功能来处理无限制的流,还具有专用的运算符来有效地处理有限制的流。
- 实时流和记录流:所有数据均作为流生成。有两种处理数据的方法。在生成流时对其进行实时处理,或将流持久化到存储系统(例如文件系统或对象存储),并在以后进行处理。Flink应用程序可以处理记录的流或实时流。
2)状态
每个非平凡的流应用程序都是有状态的,即,仅对个别事件应用转换的应用程序不需要状态。任何运行基本业务逻辑的应用程序都需要记住事件或中间结果,以便在以后的某个时间点访问它们,例如,在接收到下一个事件时或在特定的持续时间之后。
应用程序状态是Flink中的第一等级。通过查看Flink在状态处理上下文中提供的所有功能,可以看到这一点。主要状态功能如下:
- 多个状态原语:Flink为不同的数据结构(例如原子值,列表或映射)提供状态原语。开发人员可以根据功能的访问模式选择最有效的状态原语。
- 可插拔状态后端:在可插拔状态后端中管理应用程序状态,并由其提供检查点。Flink具有不同的状态后端,这些后端将状态存储在内存或RocksDB(高效的嵌入式磁盘数据存储)中。自定义状态后端也可以插入。
- 一次状态一致性:Flink的检查点和恢复算法可确保发生故障时应用程序状态的一致性。因此,可以透明地处理故障,并且不会影响应用程序的正确性。
- 非常大状态:Flink由于具有异步和增量检查点算法,因此能够保持大小为数TB的应用程序状态。
- 可扩展的应用程序:Flink通过将状态重新分配给更多或更少的工作程序来支持有状态应用程序的扩展。
3)时间
时间是流应用程序的另一个重要组成部分。大多数事件流具有固有的时间语义,因为每个事件都是在特定的时间点产生的。此外,许多常见的流计算都是基于时间的,例如窗口聚合,会话化,模式检测和基于时间的联接。流处理的一个重要方面是应用程序如何测量时间,即事件时间与处理时间之差。
Flink提供了一组丰富的与时间相关的功能:
- 事件时间模式:使用事件时间语义处理流的应用程序根据事件的时间戳计算结果。因此,无论是处理记录的事件还是实时事件,事件时间处理都可以提供准确一致的结果。
- 水印支持:Flink在事件时间应用程序中使用水印推理时间。水印还是一种权衡结果的等待时间和完整性的灵活机制。
- 后期数据处理:在带有水印的事件时间模式下处理流时,可能会发生所有相关事件到达之前已经完成计算的情况。这种事件称为迟发事件。Flink具有多个选项来处理较晚的事件,例如通过侧面输出重新路由它们并更新先前完成的结果。
- 处理时间模式:除事件时间模式外,Flink还支持处理时间语义,该语义执行由处理机的挂钟时间触发的计算。处理时间模式可能适合具有严格的低延迟要求的某些应用程序,这些应用程序可以忍受近似结果。