本文为转载文章,原文地址:https://blog.jrwang.me/2019/flink-source-code-streamgraph/ 作者:jrthe42
前言
在研究学习hudi flink源码时发现实际上写Hudi的主要逻辑是在Hudi自定义的StreamOperator
和SinkFunction
中实现,它们是通过DataStream
的transform
和addSink
调用实现,继续研究发现和Flink的Transformation
和StreamOperator
有关。那么就需要了解StreamOperator
的调用执行逻辑,最后发现这需要了解Flink Task的的运行逻辑,知道Flink的Task或者Function是如何运行的。而这里的逻辑是比较复杂的,大概包含StreamGraph
、JobGraph
、ExecutionGraph
、Physical Graph
(虚拟结构)的生成或者构建,还有JobManager
和TaskManager
的启动,而JobManager
又包含ResourceManager
、Dispatcher
和JobMaster
, 这里涉及Java8异步编程如CompletableFuture
和基于Akka
的RPC
通信,最后才是Task
的的部署和启动,StreamOperator
相关方法的调用最终是通过启动Task.run方法
在StreamTask
中实现的。
我现在只需要了解主要的调用逻辑,暂时没有精力研究具体的每个步骤的详细源码,正好查阅相关资料时发现了几篇不错的文章,所以转载一下,先从StreamGraph
开始。
注意:本篇文章对应的Flink版本比较老了(1.7或1.8),但主要的逻辑一样,可以参考文章和新版Flink源码进行学习,以下为原文
在编写 Flink 的程序的时候,核心的要点是构造出数据处理的拓扑结构,即任务执行逻辑的 DAG。我们先来看一下 Flink 任务的拓扑在逻辑上是怎么保存的。
StreamExecutionEnvironment
StreamExecutionEnvironment
是 Flink 在流模式下任务执行的上下文,也是我们编写 Flink 程序的入口。根据具体的执行环境不同,StreamExecutionEnvironment
有不同的具体实现类,如 LocalStreamEnvironment
, RemoteStreamEnvironment
等。StreamExecutionEnvironment
也提供了用来配置默认并行度、Checkpointing 等机制的方法,这些配置主要都保存在 ExecutionConfig
和 CheckpointConfig
中。我们现在先只关注拓扑结构的产生。