1、Flink 分布式运行架构
执行原理:
- Client 提交作业,相当于 Spark 的 Driver
- ActorSystem 相当于 Hadoop RPC,是用来进行节点之间通信的
- Client 的程序 DataFlow 相当于是 StreamGraph,而后通过优化成 JobGraph
- 由 ActorSystem 把 JobGraph 提交到 JobManager 节点
- JobManager 对 JobGraph 引入并行度造成 ExecutionGraph
- 而后由 TaskScheduler 进行 task 之间的任务调度,将 task 调配到 TaskSlot 外面运行,底层也是基于 ActorSystem 进行交互
- TaskManager 会返回 task 运行的状态信息给 JobManager,JobManager 会将 task 运行的状态信息返回给客户端
- 在⻚面上能够看到工作的执行状况,是由 TaskManager 返回给 JobManager,而后 JobManager 返回给客户端的
2、数据传输的策略
随机分区 (shuffle)
-
最简略的重分区形式就是间接“洗牌”。通过调用 DataStream 的.shuffle() 办法,将数据随机地调配到上游算子的并行任务中去
轮询分区 (REBALANCE)
-
通过调用 DataStream 的.rebalance() 办法,就能够实现轮询重分区。rebalance 应用的是 Round-Robin 负载平衡算法,能够将输出流数据平均分配到上游的并行任务中去
重缩放分区 (rescale)
-
重缩放分区其实和轮询分区十分类似。不同点是轮询分区是针对所有分区进行轮询,重缩放分区只对指定分区外部进行轮询。如下图所示,source 并行度为 2,上游 flatMap 并行度为 4:
其实就是分成了小组,在组内进行 REBALANCE。通过调用 DataStream 的.rebalance()
播送 (broadcast)
-
简略说就是一份数据散发到上游所有的 Task 中。能够通过调用 DataStream 的 broadcast() 办法,将输出数据复制并发送到上游算子的所有并行任务中去
全局分区 (global)
-
全局分区也是一种非凡的分区形式。这种做法十分极其,通过调用.global() 办法,会将所有的输出流数据都发送到上游算子的第一个并行子工作中去。这就相当于强行让上游工作并行度变成了 1
自定义分区 (Custom)
-
当 Flink 提供的所有分区策略都不能满足用户的需要时,咱们能够通过应用 partitionCustom() 办法来自定义分区策略。
在调用时,办法须要传入两个参数,
第一个是自定义分区器(Partitioner)对象,
第二个是利用分区器的字段,
它的指定形式与 keyBy 指定 key 根本一样:能够通过字段名称指定,也能够通过字段地位索引来指定,还能够实现一个 KeySelector* HASH
- 对数据流进行 keyBy/window、keyBy/reduce 操作
3、Task 并行度和 Slot 的关系
如果 task 的工作数量也就是并行度大于 slot 那么程序会无奈运行
- 一个 TaksManager 外面默认只有一个 slot
- 在 task 运行的过程中会进行算子合并,会产生 operatorChain 的状况,比如说 KeyBy->Map
Operator Chain 的条件 :
- 数据传输策略是 forward strategy
- 在同一个 TaskManager 中运行
- TaskManager 会尽量保障 task 在同一个 JVM 外面运行,有利于晋升效率
如下图,设置 Source 并行度为 3,faltMap 并行度为 2,keyBy->sum->map 并行度为 2,Sink 并行度为 1,一共 8 个 Task
如果全局并行度设置为 1 呢?
- source -> flatmap 属于 operator Chain 的状况,会将 souce->flatMap 进行合并为一个 task
- keyby sum -> map -> sink 也是属于 oprator chain 的状况,会将 keyby sum -> map -> sink 进行合并为一个 task
- 上游 task -> 上游 task 因为两头有 keyby 所以数据传输的策略是 keybased strategy,也就是 HASH
所以上述 2 个 Task
4、Flink 四层图构造
-
Flink 程序从提交到运行,须要经验如下 4 个阶段 :
- Stream Graph
- Job Graph
- Execution Graph
- Physical Execution Graph
- Stream Graph 和 Job Graph 是在客户端阶段实现的,而后 client 通过 ActorSystem 把 JobGraph 提交到 JobManager
- Execution Graph 阶段会引入并行度
- Physical Execution Graph 进一步确定了数据寄存的地位和收发的具体形式