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

Flink源码解析(一)

Nathan的笔记 2020-02-02
371

相较于MR的工作流程,Flink作为实时处理计算框架会有哪些不同呢。这里结合一个简单的例子,来分析下它的源码。

比如,通过Flink将一个简单的文本进行拆分,这个实现起来很简单:

构造好环境后,将文本加入数据源,使用flatmap方法进行处理.

关键是这里我们可以跟踪下源码,看看底层是如何工作的:

在调用execute方法后,Flink会去生成streamGraph,而这个streamGraph中会去计算当前应用对应的transformations有多少个.

从追踪结果来看,Flink将这个应用分为了2个transformations,1个就是flatmap,对应的算子operator为StreamFlatMap,另外一个是结果的输出对应的operator为StreamSink,也就是打印.

同时,transformations在这里是一个数组Arraylist:

包含了transformation的id,name,outputType(输出格式),并行度.

从这里分析可以看出,Flink是把每个算子都transform为一个对流的转换,最生成streamGraph,也就是说streamGraph代表程序的拓扑结构,是从用户代码直接生成的图,从source到各种map,flatmap等再到sink操作全部被映射成了StreamTransformation.比如,这里应用就被flink映射为OneInputTransformation和SinkTransformation.

从源码里面看,封装了如下的StreamTransformation:

接下来,有了streamGraph后,会继续生成jobGraph,这个图是要交给flink去生成task的图.

那么,flink的应用提交后,从开始的streamGraph->jobGraph->ExecutionGraph的差异在哪呢.

从追踪源码可以看出:

1.streamGraph是对用户应用程序逻辑的映射,映射为对应流的图;

2.jobGraph基于streamGraph进一步做了优化,比如把部分的操作串成chain提高效率;

3.ExecutionGraph已经可以用于调度任务.

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

评论