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 进一步确定了数据存放的位置和收发的具体方式
如感兴趣,点赞加关注,谢谢
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。