这几天在摸索Apache Flink,对Task Slot的概念有些疑惑。虽然已经问了几个问题,但有一点我不明白。
我正在使用玩具应用程序进行测试,运行本地集群。我已禁用操作员链接
我从文档中知道插槽允许内存隔离而不是 CPU 隔离。阅读文档,似乎 Task Slot 是一个 Java 线程。
1) 当我使用 parallelism=1 部署我的应用程序时,所有操作员的子任务都部署在同一个插槽中。但是,如果我从 的open()方法打印当前线程 ID AbstractStreamOperator,我会看到不同子任务的不同 ID。那么,它们不是共享同一个线程(即插槽?)。
2) 如果我将并行度从 1 更改为 3,我需要 3 个插槽才能正确重新部署应用程序。文档确认插槽数限制了我可以拥有的并行度。但是为什么我可以在同一个槽里有不同算子的子任务,而在同一个槽里不能有同一个算子的子任务呢?
感谢您的任何解释!
插槽的想法是将可用资源分成更小的部分。可用的托管内存均匀分布在所有插槽中。CPU 周期和 JVM 堆内存不是正确隔离的 wrt 插槽。
在每个插槽中,您可以部署一个或多个Tasks. FlinkTask由专用线程执行。因此,如果您Tasks部署了多个线程,则可以在同一个插槽中运行多个线程。
ATask表示单个 Flink 算子或多个算子(如果它们是可链接的)的并行实例。链接并不总是可行或需要的,但如果应用它,它将融合运算符,以便它们由同一Task线程执行。这通常更有效,因为上下文切换更少,并且没有将记录移交给不同的线程。
为了提高资源利用率(尤其是对Tasks资源需求很小的情况),并且为了更容易地推理出运行一个 Flink 程序需要多少槽,Flink 支持槽共享。槽位共享意味着不同算子的并行实例可以部署到同一个槽位。由于这个特性,Flink 尽可能地创建不同算子的管道,并将它们部署到同一个槽中。这也有很好的效果,您可以增加生产者与其各自消费者的共存。由于这个特性,用户知道他们只需要提供与一个拓扑的所有算子的最大并行度一样多的槽。
但是,由于您仍然希望将一个算子的并行实例分布在所有可用的 中TaskExecutors,因此 Flink 不支持将同一算子的并行实例部署到同一个 slot。如果您想这样做,那么您应该简单地将相应运算符的并行度减少到1.
| 归档时间: |
|
| 查看次数: |
513 次 |
| 最近记录: |