Flink 是什么
Apache Flink is a framework for stateful computations over unbounded and bounded data streams. Since many streaming applications are designed to run continuously with minimal downtime, a stream processor must provide excellent failure recovery, as well as, tooling to monitor and maintain applications while they are running.
Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。
关键词:
- stateful computations 有状态计算
- unbounded and bounded 无界(数据流)和 有界(数据流)
- stream processor 流处理
- failure recovery 故障恢复
- monitor (运行时)监控
Flink 基础组件
Data Stream 数据流
Data Stream 是流处理的基本要素。
特征:
- 有界 和 无界
Flink 在无界的数据流处理上拥有诸多功能强大的特性,同时也针对有界的数据流开发了专用的高效算子。 - 实时 和 历史
所有的数据都是以流的方式产生,但用户通常会使用两种截然不同的方法处理数据。或是在数据生成时进行实时的处理;亦或是先将数据流持久化到存储系统中——例如文件系统或对象存储,然后再进行批处理。Flink 的应用能够同时支持处理实时以及历史记录数据流。
Stateful 状态
Application state is a first-class citizen in Flink. 说明应用状态在 Flink 中的重要性
从图中可以看到,在流处理过程中,每一个事件处理的过程中都会与 State 进行信息交互。
特点:
- 多种状态基础类型:
atomic values、lists、maps - 插件化的 State Backend(应用状态存储端):
可以将状态存在内存或者 RocksDB,也可以自定义 - Exactly-once state consistency:应用状态强一致性
checkpoint 和故障恢复算法保证了故障发生后应用状态的一致性 - 超大数据量状态(Very Large State)
存储数 TB 级别的应用状态 - 可弹性伸缩的应用
Flink 能够通过将状态重新分布到更多或更少的工作节点上,从而支持有状态应用的分布式横向伸缩
Time 时间
Time is another important ingredient of streaming applications.
因为事件总是在特定时间点发生,所以大多数的事件流都拥有事件本身所固有的时间语义。进一步而言,许多常见的流计算都基于时间语义,例如窗口聚合、会话计算、模式检测和基于时间的 join。流处理的一个重要方面是应用程序如何衡量时间,即区分事件时间(event-time)和处理时间(processing-time)。
Flink中的时间语义:
Processing Time | Event Time (Row Time) |
真实世界的时间 | 数据世界的时间 |
处理数据节点的本地时间 | 记录携带的时间 Timestamp |
处理简单 | 处理复制 |
结果不确定(不可重现) | 结果确定(可重现) |
- 事件时间模式
- Watermark 支持
- 迟到数据处理
- 处理时间模式
时间提点:时间只能递增,不会来回穿越。
- 处理时间模式
计算节点的本地时间,在时钟同步的情况下,每一次取到的 Processing Time 肯定都是递增
的,递增就代表着有序,所以说我们相当于拿到的是一个有序的数据流。 - 事件时间模式
时间绑定在每一条记录上,由于网络延迟、程序内部逻辑、或者其他一些分布式系统的原因,数据的时间可能会存在一定程度的乱序。
Flink API 结构
Flink 根据抽象程度分层,提供了三种不同的 API。每一种 API 在简洁性和表达力上有着不同的侧重,并且针对不同的应用场景。
时间属性是流处理中最重要的一个方面,是流处理系统的基石之一,贯穿这三层 API
ProcessFunction
最底层的API只提供有状态和及时的流处理。它通过 Process Function 嵌入到 Data Stream API中。它允许用户自由处理来自一个或多个流的事件,并提供一致的容错状态。此外,用户可以注册事件时间和处理时间回调,允许程序实现复杂的计算。它提供了对于时间和状态的细粒度控制。
DataStream API
为许多通用的流处理操作提供了处理原语。这些操作包括窗口、逐条记录的转换操作,在处理事件时进行外部数据库查询等。提供对流数据的处理,对应的 DataSet API 对有界数据流提供处理原语,例如循环/迭代
SQL & Table API
这两个 API 都是批处理和流处理统一的 API,这意味着在无边界的实时数据流和有边界的历史记录数据流上,关系型 API 会以相同的语义执行查询,并产生相同的结果。Table API 和 SQL 借助了 Apache Calcite 来进行查询的解析,校验以及优化。它们可以与 DataStream 和 DataSet API 无缝集成
Flink 毫秒级 —— 充分利用内存性能
有状态的 Flink 程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中。任务通过访问本地(通常在内存中)状态来进行所有的计算,从而产生非常低的处理延迟。Flink 通过定期和异步地对本地状态进行持久化存储来保证故障场景下精确一次的状态一致性。
Flink主要特点总结
- 事件驱动
- 数据流
- 有状态计算
- 分层API
- 支持事件时间和处理时间
- 状态的强一致性保证(故障恢复)
- 低延迟(内存性能利用)
- 高吞吐
- 分布式、高可用、动态扩展