Flink 架构浅析 & 并行度 Slot 的关系

Posted 留歌留歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flink 架构浅析 & 并行度 Slot 的关系相关的知识,希望对你有一定的参考价值。

JobManager 和 TaskManager之间的通信都是借助于 Akka Framework,包括任务的状态以及Checkpoint 触发等信息

Flink中每一个worker(TaskManager)都是一个JVM进程,它可能会在独立的线程(Solt)上执行一个或多个subtask

Flink的每个TaskManager为集群提供Solt

Slot的数量由集群中flink-conf.yaml配置文件中设置taskmanager.numberOfTaskSlots的值为3

TaskManager 从 JobManager 接收需要部署的任务,然后使用 Slot 资源启动 Task,建立数据接入的网络连接,接收数据并开始数据处理
可以看出,Flink 的任务运行其实是采用多线程的方式,这和 MR 多JVM 进程的方式有很大的区别 Fink 能够极大提高 CPU 使用效率,在多个任务和 Task 之间通过 TaskSlot方式共享系统资源,每个 TaskManager 中通过管理多个 TaskSlot 资源池进行对资源进行有效管理。

并行度案例分析

Flink集群中有3个TaskManager节点,每个TaskManager的Slot 数量为 3

本质:

Slot其实就是集群可以最大使用的并发数,是描述集群所拥有的并发能力

parallelism 是实际执行过程的并发度

1个 TM提供的数量 numberOfTaskSlots

如果1个TM只能提供1个Slot,并行度又为4,那么就需要启动4个TM

如果只想一个启动一个TM,那么TM就该配置多个 Slot [-Dtaskmanager.numberOfTaskSlots]

1.21.Flink Slot和并行度(parallelism)Flink的并行度由什么决定的?Flink的task是什么?slot和parallelism

1.21.Flink Slot和并行度(parallelism)
1.21.1.Flink的并行度由什么决定的?
1.21.2.Flink的task是什么?
1.21.3.slot和parallelism
1.21.3.1.slot是指taskmanager的并发执行能力
1.21.3.2.parallelism是可配置、可指定的
1.21.4.slot和parallelism总结

1.21.Flink Slot和并行度(parallelism)

Flink运行时主要角色有两个:JobManager和TaskManager,无论是standalone集群,flink on yarn都是要启动这两个角色。JobManager主要是负责接受客户端的job,调度job,协调checkpoint等。TaskManager执行具体的Task。TaskManager为了对资源进行隔离和增加允许的task数,引入了slot的概念,这个slot对资源的隔离仅仅是对内存进行隔离,策略是均分,比如taskmanager的管理内存是3GB,假如有两个个slot,那么每个slot就仅仅有1.5GB内存可用。Client这个角色主要是为job提交做些准备工作,比如构建jobgraph提交到jobmanager,提交完了可以立即退出,当然也可以用client来监控进度。

Jobmanager和TaskManager之间通信类似于Spark的早期版本,采用的是actor系统。如下图

1.21.1.Flink的并行度由什么决定的?

这个很简单,Flink每个算子都可以设置并行度,然后就是也可以设置全局并行度。
Api的设置:

.map(new RollingAdditionMapper()).setParallelism(10)

全局配置在flink-conf.yaml文件中,parallelism.default,默认是1:可以设置默认值大一点:

1.21.2.Flink的task是什么?

按理说应该是每个算子的一个并行度实例就是一个subtask-在这里为了区分暂时叫做substask。那么,带来很多问题,由于flink的taskmanager运行task的时候是每个task采用一个单独的线程,这就会带来很多线程切换开销,进而影响吞吐量。为了减轻这种情况,flink进行了优化,也即对subtask进行链式操作,链式操作结束之后得到的task,再作为一个调度执行单元,放到一个线程里执行。如下图的,source/map 两个算子进行了链式;keyby/window/apply有进行了链式,sink单独的一个。

说明:图中假设是source/map的并行度都是2,keyby/window/apply的并行度也都是2,sink的是1,总共task有五个,最终需要五个线程。

默认情况下,flink允许如果任务是不同的task的时候,允许任务共享slot,当然,前提是必须在同一个job内部。

结果就是,每个slot可以执行job的一整个pipeline,如上图。这样做的好处主要有以下几点:

1.Flink 集群所需的taskslots数与job中最高的并行度一致。也就是说我们不需要再去计算一个程序总共会起多少个task了。

2.更容易获得更充分的资源利用。如果没有slot共享,那么非密集型操作source/flatmap就会占用同密集型操作 keyAggregation/sink 一样多的资源。如果有slot共享,将基线的2个并行度增加到6个,能充分利用slot资源,同时保证每个TaskManager能平均分配到重的subtasks,比如keyby/window/apply操作就会均分到申请的所有slot里,这样slot的负载就均衡了。

链式的原则,也即是什么情况下才会对task进行链式操作呢?简单梗概一下:

上下游的并行度一致
下游节点的入度为1 (也就是说下游节点没有来自其他节点的输入)
上下游节点都在同一个 slot group 中(下面会解释 slot group)
下游节点的 chain 策略为 ALWAYS(可以与上下游链接,map、flatmap、filter等默认是ALWAYS)
上游节点的 chain 策略为 ALWAYS 或 HEAD(只能与下游链接,不能与上游链接,Source默认是HEAD)
两个节点间数据分区方式是 forward(参考理解数据流的分区)
用户没有禁用 chain

1.21.3.slot和parallelism

1.21.3.1.slot是指taskmanager的并发执行能力

在hadoop 1.x 版本中也有slot的概念,有兴趣的读者可以了解一下

parallelism.default:1
运行程序默认的并行度为1,9个TaskSlot只用了1个,有8个空闲。设置合适的并行度才能提高效率。

1.21.3.2.parallelism是可配置、可指定的

1.可以通过修改 F L I N K H O M E / c o n f / f l i n k − c o n f . y a m l 文 件 的 方 式 更 改 并 行 度 2. 可 以 通 过 设 置 FLINK_HOME/conf/flink-conf.yaml文件的方式更改并行度 2.可以通过设置 FLINKHOME/conf/flinkconf.yaml2.FLINK_HOME/bin/flink 的-p参数修改并行度
3.可以通过设置executionEnvironmentk的方法修改并行度
4.可以通过设置flink的编程API修改过并行度
5.这些并行度设置优先级从低到高排序,排序为api>env>p>file.
6.设置合适的并行度,能提高运算效率
7.parallelism不能多与slot个数。

1.21.4.slot和parallelism总结

1.slot是静态的概念,是指taskmanager具有的并发执行能力
2.parallelism是动态的概念,是指程序运行时实际使用的并发能力
3.设置合适的parallelism能提高运算效率,太多了和太少了都不行
4.设置parallelism有多中方式,优先级为api>env>p>file

作者:香山上的麻雀
链接:https://www.jianshu.com/p/3598f23031e6

以上是关于Flink 架构浅析 & 并行度 Slot 的关系的主要内容,如果未能解决你的问题,请参考以下文章

1.21.Flink Slot和并行度(parallelism)Flink的并行度由什么决定的?Flink的task是什么?slot和parallelism

Flink的并行度及Slot

10-flink TaskManager 和 Slots

Flink流式计算从入门到实战 二

Flink学习小计-编程模型

flink调优_yarn动态分配cpu资源