我知道任务管理器可以有多个任务槽。
但是,什么是任务槽? JVM 进程还是内存中的对象还是线程?
答案可能会迟到。但是:
任务管理器 (TM) 是 JVM 进程,而任务槽 (TS) 是相应 JVM 进程 (TM) 内的线程。 TM 的托管内存在 TM 内的 TS 之间平均分配。插槽之间不会发生 CPU 隔离,只是划分托管内存。 此外,同一TM中的TS共享TCP连接(通过复用)和心跳消息。他们还可以共享数据集和数据结构,从而减少每个任务的开销。
每个worker(TaskManager)都是一个JVM进程,并且可以在单独的线程中执行一个或多个子任务。为了控制一个工作人员接受多少任务,一个工作人员有所谓的任务槽(至少一个)。
@Janukowitsch 的回答很好。 此外,TS 表示 TM 资源的固定子集。一个 TS 可以占用多个线程。实际上一个子任务/任务是由一个线程执行的。多个子任务/任务可以部署在同一个槽中。
我想解决之前答案中的一些不一致之处:
TaskSlot 是一个线程
默认设置TaskSlot != Thread。 TaskSlot = 仅当槽共享被禁用时才是线程。插槽共享是默认启用的优化,在大多数情况下,您希望保持这种状态。更准确地说,每个操作员链都会获得一个单独的线程 [1] 来执行。
TS 代表 TM 资源的固定子集
事实并非如此。任务槽纯粹是一个调度概念,它可以控制将有多少操作员或操作员链放置在哪个任务管理器上。不保证将一组固定资源分配给任务槽。例如,如果您有一个具有 5 个核心和 5GB RAM 的任务管理器,并分配了两个任务插槽,这些插槽将“竞争”CPU 和内存 - 它们不会以任何固定方式分割。
简而言之 - 任务槽是一个资源管理单元,其中操作符链在专用线程中执行,每个子任务都有状态。槽获取子任务执行的一部分内存,并主要用它来保存状态。 taskSkot 有自己的线程池,它获取一系列操作符来执行。该链在一个线程中执行,可以独占访问其状态。 通常,图链(从源到汇)的所有运算符都在线程中执行,并使用同一 TM 中任务槽的资源,但这不是强制性的。
插槽数量通常与每个 TaskManager 的可用 CPU 核心数量成正比。作为一般建议,可用 CPU 核心的数量是 taskmanager.numberOfTaskSlots 的一个很好的默认值。