困惑于FLINK任务槽

9

我知道任务管理器可以有多个任务槽。

但是,什么是任务槽?是JVM进程、内存中的对象还是线程?

5个回答

14
可能回答有些晚了,但是:
任务管理器(TM)是一个JVM进程,而任务槽(TS)是在该JVM进程(TM)中的一个线程。每个TM的受管内存平均分配给其中的TS。各槽之间没有CPU隔离,只是将受管内存划分开。此外,同一TM内的TS共享TCP连接(通过多路复用)和心跳消息。它们也可以共享数据集和数据结构,从而降低每个任务的开销。
来源:https://ci.apache.org/projects/flink/flink-docs-release-1.5/concepts/runtime.html#task-slots-and-resources

感谢@janukowitsch的好回答。我想知道Flink为什么引入了这个概念,我的理解是TaskSlot只是TM中实际运行任务逻辑的线程。 - Tom
我不确定,但我认为其中一个原因是TS也是一个行政单位,因为像主存储器这样的资源是共享的。此外,在生成随机数量的线程而不是配置固定数量的线程时,任务调度可能是非常棘手的。@Tom - Janukowitsch
1
如果禁用了插槽共享,TaskSlot = Thread only (!)。这是一种默认开启的优化措施,在大多数情况下,您都应该保持默认设置。更准确地说,一个操作链=一个线程。 - Alex Fedulov
你能详细解释一下“由TM管理的(分配给任务槽)内存”和“堆内存”吗? - Shubham

4

3
@Janukowitsch的回答很好。此外,TS代表TM的固定资源子集。一个TS可以占用多个线程。实际上,一个子任务/任务由一个线程执行。多个子任务/任务可以部署在同一插槽中。

你的回答更详细。你能提供一些参考资料吗?我在文档中找不到关于你回答的任何信息。 - Zentopia
@Zentopia 参考链接:https://stackoverflow.com/questions/55590809/can-i-have-multiple-subtasks-of-an-operator-in-the-same-slot-in-flink 和 https://subscription.packtpub.com/book/big_data_and_business_intelligence/9781786466228/1/ch01lvl1sec9/distributed-execution 以及 https://ci.apache.org/projects/flink/flink-docs-stable/concepts/runtime.html#task-slots-and-resources - Qoobee

2
我想指出之前回答中的一些不一致之处:

TaskSlot 是一个线程

默认情况下,TaskSlot 不等于 Thread。只有在禁用插槽共享时,TaskSlot = Thread。插槽共享是一种默认开启的优化,大多数情况下,您应该保持这种状态。更准确地说,每个操作器链都会为其执行生成单独的线程[1]。

TS 表示 TM 的固定资源子集

这并不是事实。任务插槽仅仅是一个调度概念,它可以控制在哪个任务管理器上放置多少个操作器或操作器链。没有保证将一组固定的资源分配给任务插槽。例如,如果您有一个具有 5 个内核和 5GB RAM 的任务管理器,分配了两个任务插槽,那么这些插槽将“竞争”CPU和内存 - 它们不会以任何固定的方式划分。


-2

槽位数量通常与每个TaskManager可用CPU核心数成比例。作为一般建议,可用CPU核心数是taskmanager.numberOfTaskSlots的良好默认值。


4
答案没有解释任务槽(task slot)是什么,只是解释了如何确定槽数量,这不是问题所询问的。 - insanely_sin
2
我进行了一次简单的谷歌搜索,然后来到了这里——最好的提供简单答案的网站。 - offroff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接