文章目录
what Parallelism Slot ?
parallelism 是并行的意思
slot 槽位的意思
先来看一张Flink官网中一张经典图
图中 TaskManager 是从 JobManager 处接收需要部署的 Task,任务能配置的最大并行度由 TaskManager 上可用的 Slot决定
Slot 和 Parallelism 的关系
1.Slot 是指 TaskManager 最大能并发执行的能力
Flink 配置文件中设置的一个 TaskManager 默认的Slot 是 1,taskmanager.numberOfTaskSlots: 1
该参数可以根据实际情况做一定的修改。
如上图,如果设置的单个 TaskManager 的 Slot 个数为 3,启动 3 个 TaskManager 后,那么就一共有 9 个 Slot
2.parallelism 是指 TaskManager 实际使用的并发能力
- 如果在你的 Flink Job 里面不设置任何 parallelism 的话,那么它也会有一个默认的 parallelism(默认为1),那也意味着可以修改这个配置文件的默认并行度来提高 Job 的执行效率。如果是使用命令行启动你的 Flink Job,那么你也可以这样设置并行度(使用-p n 参数 flink run -p 10)
- 也可以通过
env.setParallelism(n)
来设置整个程序的并行度: env.setParallelism(10);
这样设置的并行度是整个程序的并行度,那么后面如果每个算子不单独设置并行度覆盖的话,那么后面每个算子的并行度就都是以这里设置的并行度为准了 - 给每个算子设置并行度
data.keyBy(new xxxKey())
.flatMap(new XxxFlatMapFunction()).setParallelism(5)
.map(new XxxMapFunction).setParallelism(5)
.addSink(new XxxSink()).setParallelism(1)
如上就是给每个算子单独设置并行度,这样的话,就算程序设置了 env.setParallelism(10)
也是会被覆盖的。这也说明优先级是:算子设置并行度 > env 设置并行度 > 配置文件默认并行度
运行程序默认的并行度为 1,9 个 Slot 只用了 1 个,有 8 个处于空闲,设置合适的并行度才能提高 Job 计算效率。
parallelism 是可配置、可指定的
上图中 example2 每个算子设置的并行度是 2, example3 每个算子设置的并行度是 9
example4 除了 sink 是设置的并行度为 1,其他算子设置的并行度都是 9
总结
Slot 在Flink里面可以任务是资源组,Flink将每个热舞分成子任务并且将这些子任务分配到Slot中,这样就可以并行的执行程序
如果 TaskManager 有四个 Slot,那么它将为每个 Slot 分配 25% 的内存。 可以在一个 Slot 中运行一个或多个线程。 同一Slot 中的线程共享相同的 JVM。 同一 JVM 中的任务共享 TCP 连接和心跳消息。TaskManager 的一个 Slot代表一个可用线程,该线程具有固定的内存,注意 Slot 只对内存隔离,没有对 CPU 隔离。默认情况下,Flink 允许子任务共享 Slot,即使它们是不同Task 的 subtask,只要它们来自相同的 Job,这种共享模式可以大大的提高资源利用率
上图有两个TaskManager每个TM有3个Slot,这样我们的算子最大并行度就是6个,同一个Slot里面可以执行1至多个子任务。
图中 source/map/keyby/window/apply 算子可以设置最大6个并行度,sink只设置了1个并行度。