探索Apache Flink几天了,对Task Slot的概念有些疑惑。虽然有人问了几个问题,但有一点我不明白。
我正在使用一个玩具应用程序进行测试,运行本地集群。我已禁用运算符链接
我从文档中知道插槽允许内存隔离而不是 CPU 隔离。阅读文档,任务槽似乎是一个 Java 线程。
1)当我以parallelism=1部署应用程序时,所有操作员的子任务都部署在同一个槽中。但是,如果我从open()
的方法AbstractStreamOperator
,我看到不同的子任务有不同的 ID。那么,它们不是共享同一个线程(即插槽吗?)。
2) 如果我将并行度从 1 更改为 3,则需要 3 个插槽才能正确重新部署应用程序。文档证实槽的数量限制了我可以拥有的并行性。但是为什么我可以在同一个槽中拥有不同算子的子任务,而不能在同一个槽中拥有同一算子的子任务呢?
感谢您的任何解释!
槽的想法是将可用资源分割成更小的部分。可用的托管内存均匀分布在所有插槽中。 CPU 周期和 JVM 堆内存不是与插槽正确隔离的。
在每个插槽中您可以部署一个或多个Tasks
。弗林克Task
由专用线程执行。因此,如果您有多个线程,则可以在同一个插槽中运行多个线程Tasks
部署到它。
A Task
表示单个 Flink 运算符或多个运算符(如果可链接)的并行实例。链接并不总是可行或理想的,但如果应用,它将融合运算符,以便它们由相同的运算符执行Task
线。这通常更有效,因为上下文切换更少,并且无需将记录移交给不同的线程。
为了提高资源利用率(特别是对于Tasks
需要很少的资源)并且为了更容易地推理运行 Flink 程序需要多少个槽,Flink 支持槽共享。槽共享意味着不同算子的并行实例可以部署到同一个槽。由于这个特性,Flink 尽可能创建不同算子的长管道并将它们部署到同一个槽。这还有一个很好的效果,可以增加生产者与其各自消费者的同地办公。由于此功能,用户知道他们只需要提供与一个拓扑的所有运算符的最大并行度一样多的插槽。
但是,由于您仍然希望将运算符的并行实例分布在所有可用的TaskExecutors
,Flink不支持将同一算子的并行实例部署到同一槽位。如果你想这样做,那么你应该简单地将相应运算符的并行度减少到1
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)