一、flink处理任务流程
① 获取执行环境 (Environment)
② 加载或者创建数据源(source)
③ 转化处理数据(transformation)
④ 输出目的端(sink)
⑤ 执行任务(execute)
二、flink的几种状态类型
2.1 Managed State和Raw State
Managed State | Raw State | |
---|---|---|
状态管理方式 | Flink Runtime托管,自动存储、自动恢复、自动伸缩 | 用户自己管理 |
状态数据结构 | Flink提供的常用数据结构,如ListState、MapState等 | 字节数组:byte[] |
使用场景 | 绝大多数Flink算子 | 用户自定义算子 |
两者的具体区别有:
- 从状态管理的方式上来说,Managed State由Flink Runtime托管,状态是自动存储、自动恢复的,Flink在存储管理和持久化上做了一些优化。当我们横向伸缩,或者说我们修改Flink应用的并行度时,状态也能自动重新分布到多个并行实例上。Raw State是用户自定义的状态。
- 从状态的数据结构上来说,Managed State支持了一系列常见的数据结构,如ValueState、ListState、MapState等。Raw State只支持字节,任何上层数据结构需要序列化为字节数组。使用时,需要用户自己序列化,以非常底层的字节数组形式存储,Flink并不知道存储的是什么样的数据结构。
- 从具体使用场景来说,绝大多数的算子都可以通过继承Rich函数类或其他提供好的接口类,在里面使用Managed State。Raw State是在已有算子和Managed State不够用时,用户自定义算子时使用。
2.2 Keyed State和Operator State
对Managed State继续细分,它又有两种类型:Keyed State和Operator State。
Keyed State | Operator State | |
---|---|---|
适用算子类型 | 只适用于KeyedStream上的算子 | 可以用于所有算子 |
状态分配 | 每个Key对应一个状态 | 一个算子子任务对应一个状态 |
创建和访问方式 | 重写Rich Function,通过里面的RuntimeContext访问 | 实现CheckpointedFunction等接口 |
横向扩展 | 状态随着Key自动在多个算子子任务上迁移 | 有多种状态重新分配的方式 |
支持的数据结构 | ValueState、ListState、MapState等 | ListState、BroadcastState等 |
2.3 Keyed State的使用方法
首先,State主要有三种实现,分别为ValueState、MapState和AppendingState,AppendingState又可以细分为ListState、ReducingState和AggregatingState。