暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Flink源码分析之StreamGraph的生成

Nathan的笔记 2020-05-03
837

在Flink的流式计算中,很关键的一步就是将应用的逻辑转化为StreamGraph.怎么理解StreamGraph合适?说简单点,就是将流式处理的逻辑转化成一张图.很明显,Flink的设计中使用了图这种非线性表数据结构,那么图有几个基本概念:1.顶点;2:边;3.入度;4:出度.举个简单的例子如下图:

这是一个有向图,那么里面的4个元素A,B,C,D也即图的顶点;图中的顶点与其他元素有关联关系,那么这种关联关系也就是边;入度表示有多少条边指向了该顶点,出度则相反,表示有多少条边是以这个顶点为起点指向其他顶点.

刚好,Flink的StreamGraph也是利用了这种原理,它的源码实现是在org.apache.flink.streaming.api.graph包中.

这里我们可以追踪一个经典的单词统计的Flink应用的实现情况.

从源码里面可以看到,Flink将该应用的逻辑转换为3个transformations放入List中保存.从名字上可以看出,该应用包含了Flatmap,KeyedAggregation和Std.out三个操作;DataStream 上的每一个 Transformation 都对应了一个 StreamOperator.

这里对于每一个transformations进行进一步的逻辑处理,比如这里包含了

两个OneInputTransformation和一个SinkTransformation.

Flink里面封装了多种transform的实例处理逻辑.每一个transformation进行转换,转换成 StreamGraph 中的 StreamNode 和 StreamEdge.

streamGraph.addOperator用于构造StreamNode,

streamGraph.addEdge()用于构造StreamEdge.

最后在所有的transformations处理完后,便会生成builtStreamGraph

builtStreamGraph里面其中包含了所有transformations转换生成的streamNode,这个StreamNode可以理解为图的顶点,比如这里有4个id,分别对应4个顶点1,2,4,5.

再看顶点2的value里面,包含了函数inEdges和outEdges,这个就有点类似前面提到图里面的入度与出度.

顶点2的入度为顶点1,出度为顶点4.其他顶点关系依次类推.

这样所有的transformations对应顶点在上下游都有关联关系,也就组成了一个有向图.

最后该应用生成的StreamGraph是:

DataSource(id=1)->Operator(Flatmap,id=2)->Operator(sum,id=4)->DataSink(id=5).

文章转载自Nathan的笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论