赞
踩
Flink 有四层转换流程:
通过对 Program 的执行,能够生成一个 DAG 执行图,即逻辑执行图。
第一部分将先讲解四层转化的流程,然后将以详细案例讲解四层的具体转化。
Program 转换成 StreamGraph 具体分为三步:
通过 WindowWordCount 类来看代码到 StreamGraph 的转化,在 flatMap transform 设置 slot 共享组为 flatMap_sg,并发设置为 4,在聚合的操作中设置 slot 共享组为 sum_sg,sum() 和 counts() 并发设置为 3,这样设置主要是为了演示后面如何嵌到一起的,跟上下游节点的并发以及上游的共享组有关。
WindowWordCount 代码中可以看到,在 readTextFile() 中会生成一个 transform,且 transform 的 ID 是1;然后到 flatMap() 会生成一个 transform,transform 的 ID 是2;接着到 keyBy() 生成一个 transform 的 ID 是3;再到 sum() 生成一个 transform 的 ID 是4;最后到 counts() 生成 transform 的 ID 是5。
transform 的结构如图所示,第一个是 flatMap 的 trandform,第二个是 window 的 transform,第三个是 SinkTransform 的 transform。除此之外,还能在 transform 的结构中看到每个 trandform 的 input 是什么。
接下来介绍一下 StreamNode 和 StreamEdge。
WindowWordCount transform 到 StreamGraph 转化如图所示,StreamExecutionEnvironment 的 transformations 存在 3 个 transform,分别是 FlatMap (Id 2)、window (Id 4)、sink (Id 5)。
transform 的时候首先递归处理 transform 的 input,生成 StreamNode,然后通过 StreamEdge 链接上下游 StreamNode。需要注意的是,有些 transform 操作并不会生成 StreamNode 如 PartitionTransformtion,而是生成个虚拟节点。
在转换完成后可以看到,streamNodes 有四种 transform 形式,分别为 Source、Flat Map、Window、Sink。
每个 streamNode 对象都携带并发个数、slotSharingGroup、执行类等运行信息。
StreamGraph 到 JobGraph 的转化步骤:
从 source 节点递归寻找嵌到一起的 operator 中,嵌到一起需要满足一定的条件,具体条件介绍如下:
JobGraph 对象结构如上图所示,taskVertices 中只存在 Window、Flat Map、Source 三个 TaskVertex,Sink operator 被嵌到 window operator 中去了。
Flink 任务失败的时候,各个 operator 是能够从 checkpoint 中恢复到失败之前的状态的,恢复时是依据 JobVertexID (hash值) 进行状态恢复的。相同的任务在恢复时要求 operator 的 hash 值不变,因此能够获取对应的状态。
如果用户对节点指定了一个散列值,则基于用户指定的值能够产生一个长度为 16 的字节数组。如果用户没有指定,则根据当前节点所处的位置,产生一个散列值。
考虑的因素主要有三点:
JobGraph 到 ExecutionGraph 以及物理执行计划的流程:
基于 Yarn 层面的架构类似 Spark on Yarn 模式,都是由 Client 提交程序到 ResourceManager 上面去运行,然后 ResourceManager 分配第一个 container 去运行 ApplicationMaster,然后由 ApplicationMaster 去负责资源的监督和管理。需要说明的是,Flink 的 Yarn 模式更加类似 Spark on Yarn 的 cluster 模式,在 cluster 模式中,driver 将作为 ApplicationMaster 中的一个线程去运行。
Flink on Yarn 模式也是会将 JobManager 启动在 container 里面,去做个 driver 类似的任务调度和分配,Yarn ApplicationMaster 与 Flink JobManager 在同一个 Container 中,这样 ApplicationMaster 可以知道 Flink JobManager 的地址,从而 ApplicationMaster 可以申请 Container 去启动 Flink TaskManager。待 Flink 成功运行在 Yarn 集群上,Flink Yarn Client 就可以提交 Flink Job 到 Flink JobManager,并进行后续的映射、调度和计算处理。
在 Flink 版本 1.5 中引入了 Dispatcher,Dispatcher 是在新设计里引入的一个新概念。Dispatcher 会从 Client 端接受作业提交请求并代表它在集群管理器上启动作业。
引入 Dispatcher 的原因主要有两点:
客户端提交 JobGraph 以及依赖 jar 包到 Yarn ResourceManager,接着 Yarn ResourceManager 分配第一个 container 以此来启动 ApplicationMaster,ApplicationMaster 中会启动一个 Flink ResourceManager 以及 JobManager,JobManager 会根据 JobGraph 生成的 ExecutionGraph 以及物理执行计划向 Flink ResourceManager 申请 slot,Flink ResourceManager 会管理这些 slot 以及请求,如果没有可用 slot 就向 Yarn 的 ResourceManager 申请 container,container 启动以后会注册到 Flink ResourceManager,最后 JobManager 会将 subTask 分配到对应 container 的 slot 中去。
会增加一个过程,就是 Client 会直接通过 HTTP Server 的方式,然后用 Dispatcher 将这个任务提交到 Yarn ResourceManager 中。
新框架具有四大优势,详情如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。