Flink内核原理与实现
上QQ阅读APP看书,第一时间看更新

2.3 数据流

对Flink这种以流为核心的分布式计算引擎而言,数据流是核心数据抽象,表示一个持续产生的数据流,与Apache Beam中的PCollection的概念类似。在Flink中使用DataStream表示数据流,DataStream是一种逻辑概念,并不是底层执行的概念。DataStream上定义了常见的数据处理操作API(转换为Transformation),同时也具备自定义数据处理函数的能力,当DataStream提供的常见操作不满足需求的时候,可以自定义数据处理的逻辑。

DataStream体系如图2-3所示。

图2-3 DataStream体系

DataStreamSource本身就是一个DataStream。DataStreamSink、AsyncDataStream、BroadcastDataStream、BroadcastConnectedDataStream、QueryableDataStream都是对一般DataStream对象的封装,在DataStream实现特定的功能,接下来对这些DataStream一一进行介绍。

1. DataStream

DataStream是Flink数据流的核心抽象,其上定义了对数据流的一系列操作,同时也定义了与其他类型DataStream的相互转换关系。每个DataStream都有一个Transformation对象,表示该DataStream从上游的DataStream使用该Transformation而来。

2. DataStreamSource

DataStreamSource是DataStream的起点,DataStreamSource在StreamExecutionEnvironment中创建,由StreamExecutionEnvironment.addSource(SourceFunction)创建而来,其中SourceFunction中包含了DataStreamSource从数据源读取数据的具体逻辑。

3. DataStreamSink

数据从DataSourceStream中读取,经过中间的一系列处理操作,最终需要写出到外部存储,通过DataStream.addSink(sinkFunction)创建而来,其中SinkFunction定义了写出数据到外部存储的具体逻辑。

4. KeyedStream

KeyedStream用来表示根据指定的key进行分组的数据流。一个KeyedStream可以通过调用DataStream.keyBy()来获得。而在KeyedStream上进行任何Transformation都将转变回DataStream。在实现中,KeyedStream把key的信息写入了Transformation中。每条记录只能访问所属key的状态,其上的聚合函数可以方便地操作和保存对应key的状态。

5. WindowedStream & AllWindowedStream

WindowedStream代表了根据key分组且基于WindowAssigner切分窗口的数据流。所以WindowedStream都是从KeyedStream衍生而来的,在WindowedStream上进行任何Transformation也都将转变回DataStream。

6. JoinedStreams & CoGroupedStreams

Join是CoGroup的一种特例,JoinedStreams底层使用CoGroupedStreams来实现。两者的区别如下。

CoGrouped侧重的是Group,对数据进行分组,是对同一个key上的两组集合进行操作,可以编写灵活的代码来实现特定的业务功能。Join侧重的是数据对,对同一个key的每一对元素进行操作。CoGroup更通用,但因为Join是数据库上常见的操作,所以在CoGroup基础上提供Join的特性。

JoinGroup和CoGroup两者都是对持续不断地产生的数据做运算,但是又不能无限地在内存中持有数据,对所有的数据进行Join的笛卡儿积操作理论上不可行(理论上内存不足可以刷出到磁盘,反复的硬盘读写会导致性能变得很差),所以在底层上,两者都基于Window实现。

7. ConnectedStreams

ConnectedStreams表示两个数据流的组合,两个数据流可以类型一样,也可以类型不一样。ConnectedStreams适用于两个有关系的数据流的操作,共享State。一种典型的场景是动态规则数据处理。两个流中一个是数据流,一个是随着时间更新的业务规则,业务规则流中的规则保存在State中,规则会持续更新State。当数据流中的新数据到来时,使用保存在State中的规则进行数据处理。

8. BroadcastStream & BroadcastConnectedStream

BroadcastStream实际上是对一个普通DataStream的封装,提供了DataStream的广播行为。

BroadcastConnectedStream一般由DataStream/KeyedDataStream与BroadcastStream连接而来,类似于ConnectedStream。

9. IterativeStream

IterativeDataStream是对一个DataStream的迭代操作,从逻辑上来说,包含IterativeStream的Dataflow是一个有向有环图,在底层执行层面上,Flink对其进行了特殊处理。

10. AsyncDataStream

AsyncDataStream是个工具,提供在DataStream上使用异步函数的能力。