我已经探索apache flink几天了,我对任务槽的概念有些怀疑。虽然有人问了好几个问题,但有一点我不明白。
我正在使用一个玩具应用程序进行测试,运行一个本地集群。我禁用了操作员链接
我从文档中知道,插槽允许内存隔离,而不是cpu隔离。在阅读文档时,任务槽似乎是一个java线程。
1) 当我使用parallelism=1部署应用程序时,所有操作符的子任务都部署在同一个插槽中。但是,如果我从 open()
方法 AbstractStreamOperator
,我看到不同的子任务有不同的ID。那么,它们不是共享同一个线程(即插槽)吗。
2) 如果将并行度从1更改为3,则需要3个插槽才能正确重新部署应用程序。文档证实了插槽的数量限制了我可以拥有的并行性。但是为什么我可以在同一个插槽中有不同运算符的子任务,而不能在同一个插槽中有相同运算符的子任务呢?
谢谢你的解释!
1条答案
按热度按时间vhipe2zx1#
slot的思想是将可用资源分割成更小的部分。可用的托管内存均匀地分布在所有插槽中。cpu周期和jvm堆内存不是正确隔离的wrt插槽。
在每个插槽中可以部署一个或多个
Tasks
. FlinkTask
由专用线程执行。因此,如果有多个线程,那么可以在同一个插槽中运行多个线程Tasks
部署到它。一
Task
表示单个flink运算符或多个可链接运算符的并行示例。链接并不总是可能的或需要的,但如果应用它将融合运算符,使它们由相同的运算符执行Task
线程。这通常效率更高,因为上下文切换更少,并且没有将记录移交给不同的线程。为了提高资源利用率(特别是
Tasks
这需要很少的资源)并且为了使运行flink程序需要多少插槽的推理更容易,flink支持插槽共享。时隙共享意味着不同操作符的并行示例可以部署到同一个时隙。由于这个特性,flink创建尽可能长的不同操作符的管道,并将它们部署到同一个插槽中。这也有一个很好的效果,那就是你增加了生产商和他们各自的消费者的合作。由于这个特性,用户知道他们只需要提供与一个拓扑的所有操作符的最大并行度一样多的插槽。但是,由于您仍然希望将操作符的并行示例分布到所有可用的
TaskExecutors
,flink不支持将同一操作符的并行示例部署到同一插槽。如果您想这样做,那么您应该简单地将相应操作符的并行性降低到1
.