DataSream及其子类
image.png-
DataStreamSource
表示从数据源直接获取数据流DataStream,比如从Socket或Kafka直接消费数据 -
KeyedStream
datastream 分组之后(调用keyby)得到的分组流,虽然分组了 但是还是一个流
通常情况下数据流被分组以后,需要进行窗口window操作或聚合操作 -
SingleOutputStreamOperator
数据流没有被分组,而是使用转换算子 进行处理得到的数据流 -
IterativeStream
:迭代流,表示对流中数据进行迭代计算,比如机器学习,图计算等。(不常用)
State之状态及存储结构
State 主要分为两类
- 键控状态 keyby分组后,对应key的状态
存储数据结构:ValueState、ListState、MapState、ReducingState和AggregatingState等等 - 算子状态 非键控状态 每个算子都有对应的状态,常用于 source
存储数据结构:ListState或BroadcastState等等
以下是 键控状态的数据类型进行说明,因为键控状态常用, 分组后的聚合 常常使用自定义状态:
1. ValueState<T>
:类型为T的单值状态
- 保存一个可以更新和检索的值(每个值都对应到当前的输入数据的key,因此算子接收到的每个key都可能对应一个值)。
- 这个值可以通过update(T)进行更新,通过T value()进行检索。
理解: 只可以保存一个单值,且该值 <T>指定发泛型就是key所对应的要聚合字段的数据类型
2.ListState<T>
:key上的状态值为一个列表
- 保存一个元素的列表,可以往这个列表中追加数据,并在当前的列表上进行检索。
- 可以通过add(T)或者addAll(List<T>)进行添加元素,通过Iterable<T> get()获得整个列表。
- 还可以通过update(List<T>)覆盖当前的列表。
- 如统计按用户id统计用户经常登录的IP
3.MapState<UK,UV>
:即状态值为一个map
- 维护了一个映射列表,可以添加键值对到状态中,也可以获得反映当前所有映射的迭代器。
- 使用put(UK,UV)或者putAll(Map<UK,UV>)添加映射。
- 使用get(UK)检索特定key。
- 使用entries(),keys()和values()分别检索映射、键和值的可迭代视图
4.ReducingState<T>
:
- 保存一个单值,表示添加到状态的所有值的聚合。
- 这种状态通过用户传入的reduceFunction,每次调用add方法添加值的时候,会调用reduceFunction,最后合并到一个单一的状态值。
-
AggregatingState<IN,OUT>
:保留一个单值,表示添加到状态的所有值的聚合。和ReducingState相反的是,聚合类型可能与添加到状态的元素的类型不同。 -
FoldingState<T,ACC>
:保留一个单值,表示添加到状态的所有值的聚合。与ReducingState相反,聚合类型可能与添加到状态的元素类型不同
4.Broadcast State`:具有Broadcast流的特殊属性
- 类比批处理中广播变量:将小表数据广播到TaskManager内存,被Slot中运行Task任务使用
- 一种小数据状态广播向其它流的形式,从而避免大数据流量的传输;
- 在这里,其它流是对广播状态只有只读操作的允许,因为不同任务间没有跨任务的信息交流。
- 一旦有运行实例对于广播状态数据进行更新了,就会造成状态不一致现象
理解:该广播状态,适用于大数据流join小数据流,标记小数据流为广播状态
网友评论