【发布时间】:2017-11-09 09:06:30
【问题描述】:
我知道一个任务管理器可以有多个任务槽。
但是,什么是任务槽? JVM进程还是内存中的对象还是线程?
【问题讨论】:
标签: java apache-flink flink-streaming
我知道一个任务管理器可以有多个任务槽。
但是,什么是任务槽? JVM进程还是内存中的对象还是线程?
【问题讨论】:
标签: java apache-flink flink-streaming
答案可能来晚了。但是:
Taskmanager (TM) 是一个 JVM 进程,而 Taskslot (TS) 是相应 JVM 进程 (TM) 中的一个线程。 TM 的托管内存在 TM 内的 TS 之间平均分配。插槽之间不会发生 CPU 隔离,只是划分托管内存。 此外,同一 TM 中的 TS 共享 TCP 连接(通过多路复用)和心跳消息。它们还可以共享数据集和数据结构,从而减少每个任务的开销。
【讨论】:
每个worker(TaskManager)都是一个JVM进程,可以在不同的线程中执行一个或多个子任务。为了控制一个工人接受多少任务,一个工人有所谓的任务槽(至少一个)。
【讨论】:
@Janukowitsch 的回答很好。 此外,TS 代表 TM 资源的固定子集。一个 TS 可以占用超过 1 个线程。实际上一个子任务/任务由一个线程执行。多个子任务/任务可以部署在同一个槽中。
【讨论】:
我想解决之前答案中的一些不一致之处:
TaskSlot 是一个线程
使用默认设置 TaskSlot != 线程。 TaskSlot = 仅在禁用插槽共享时才线程。插槽共享是一种默认启用的优化,在大多数情况下,您希望保持这种状态。更准确地说,每个 Operator Chain 都有一个单独的线程 [1] 用于执行。
一个 TS 表示 TM 资源的一个固定子集
事实并非如此。任务槽纯粹是一个调度概念,它可以控制将多少操作员或操作员链放置在哪个任务管理器上。没有保证将一组固定的资源分配给任务槽。例如,如果您有一个具有 5 个内核和 5GB RAM 的任务管理器,它被分配了两个任务槽,这些槽将“竞争”CPU 和内存——它们不会以任何固定的方式分割。
【讨论】:
槽数通常与每个 TaskManager 的可用 CPU 内核数成正比。作为一般建议,可用 CPU 内核的数量是 taskmanager.numberOfTaskSlots 的一个很好的默认值。
【讨论】: