Flink的批流一体架构设计允许它同时处理流数据和批数据,这种设计使得Flink在处理不同类型的数据时能够提供一致的API和优化。以下是Flink批流一体的关键点:
1. **统一的SDK层**:Flink提供了两类SDK,关系型SDK(SQL/Table)和物理型SDK(DataStream),它们都支持流批一体的处理方式。这意味着开发者可以使用相同的逻辑来处理流数据和批数据,无论是使用SQL还是DataStream API。
2. **执行引擎层**:Flink的执行引擎使用统一的DAG(有向无环图)来描述数据处理流程。无论是流任务还是批任务,业务逻辑在执行前都会被转化为DAG图。执行引擎通过Unified DAG Scheduler将逻辑DAG转化为分布式环境下执行的任务。
3. **状态存储**:状态存储层负责存储算子的状态和执行状态。Flink提供了不同的状态后端,如RocksdbStatebackend、MemoryStatebackend和BatchStateBackend,以适应流作业和批作业的状态存储需求。
4. **流批一体的DataStream**:Flink的DataStream API允许开发者编写一次代码,同时在流和批场景下使用。这对于减少代码重复和提高开发效率非常有帮助。
5. **流批一体的DAG Scheduler**:Flink通过统一的Pipeline Region机制,使得流作业和批作业可以统一按照Pipeline Region的粒度进行调度。这种机制可以提高资源利用率并改善系统的易用性。
6. **流批一体的Shuffle架构**:Flink提供了一套统一的Shuffle架构,可以满足不同Shuffle在策略上的定制化需求,同时避免在共性需求上的重复开发。
7. **流批一体的容错策略**:Flink通过统一的容错策略,既满足批场景下的容错需求,也提升了流场景下的容错效果。
8. **执行模式**:Flink支持流(STREAMING)和批(BATCH)两种执行模式。在流模式下,Flink处理无边界的连续数据流,而在批模式下,Flink处理有边界的数据集。Flink允许用户根据作业的特点选择最合适的执行模式。
9. **状态后端/状态**:在流模式下,Flink使用StateBackend来控制状态的存储和检查点的工作方式。在批模式下,配置的状态后端被忽略,取而代之的是,keyed操作的输入按键分组,然后依次处理一个键的所有记录。
10. **处理顺序**:在流模式下,用户自定义函数不应该对传入记录的顺序做任何假设。在批模式下,Flink通过一些操作确保顺序。
11. **故障恢复**:在流模式下,Flink使用checkpoints进行故障恢复。在批模式下,Flink会尝试回溯到之前的中间结果仍可获取的处理阶段,只有失败的任务可能需要重新启动。
Flink的批流一体架构提供了强大的灵活性和一致性,使得开发者能够轻松地处理各种数据流和批处理任务。通过这种方式,Flink能够满足不同场景下的需求,无论是实时数据处理还是离线批量处理。