美文网首页
Flink内如何生成StreamGraph

Flink内如何生成StreamGraph

作者: maverick_360 | 来源:发表于2019-12-30 16:48 被阅读0次

    Flink内,任务的提交执行通过调用StreamExecutionEnvironment类的execute方法,在这个过程中,flink会构建代表任务的StreamGraph。StreamGraph构造的入口函数为StreamGraphGenerator类中的generate()函数,代码如下:

    在这个过程中,我们不难发现,构建StreamGraphGenerator类的关键是transformations;在Flink streaming内,所有针对datastream的各种转换操作,都是用transformation来表示;主要transformation集成关系如下所示:

    工作中常用的Transforamtion有map, flatMap, filter, keyBy,shuffle等方法;在DataStream类内,以flatMap为例看一下streamGraph的构建过程;其中SingleOutputStreamOperator是DataStream的子类;Datastream内flatMap方法如下:

    transform内会调用函数doTransform,在doTransform内,会将用户自定义的函数、输出类型、transformation,生成OneInputTransformation对象,同时将该Transformation对象,保存到StreamExecutionEnvironment类中的transformations列表内;

    回到文章开头时提到的StreamGraphGenerator类的generator方法,代码如下所示:

    在这里之前是以flatMap为例,所以主要关注transformOneInputTransform方法;

    但是,并不是所有的transformation都会生成pysicalTransformation,例如shuffle,rebalance,union,select等操作,就不会在runtime时生成对应的pysicalTransformation。另外,在上面的代码中,在flatMap函数内,内部调用transform函数时,会将用户自定义的flatMapFunction,生成对应的streamFlatMap对象,SteamFlatMap对象对应的集成关系如下所示,从图中可以看到其都会实现对应的StreamOperator,而select, union, rebalance等函数没有对应的StreamOperator。

    另外,带有StreamOperator的算子同其它(select/union/relance)等算子相比,还有一个显著的不同;从上面tansformaion继承关系图中可以看到,在runtime时,会生成对应物理task的算子,都继承了PhysicalTransformation类,而实现了这个类的算子在运行中(默认情况下),flink会针对算子进行优化,通过将一些operator,按照一定的策略链接在一起,并放入到一个slot(task)上去运行,依次来避免在算子运行过程中带来的网络IO(数据从上一个operator到下一个operator)/线程切换带来的影响。Flink内部针对Job的优化,后续会单独花点时间,去学习和分享~

    相关文章

      网友评论

          本文标题:Flink内如何生成StreamGraph

          本文链接:https://www.haomeiwen.com/subject/soumoctx.html