DaemonTask
用于守护服务的 DaemonTask
DaemonTask 是一种特殊类型的 Task,它会在从其 ContainerGroup 创建新 ContainerWorker 时自动启动 TaskAttempt,称为 DaemonTaskAttempt。它旨在为所有普通 TaskAttempt(称为 WorkerTaskAttempt)在后台执行服务,不构成特定 MR3 DAG 的一部分。以下是使用 DaemonTask 的两个示例:
- HivePlus 使用 DaemonTask 直接在 ContainerWorker 内部运行 LLAP(低延迟分析处理)I/O 服务。
- HivePlus 可以将其自己的 shuffle handler 作为 DaemonTask 运行,从而无需外部 shuffle 服务。
通过允许用户将自定义 DaemonTask 附加到 ContainerGroup,MR3 促进了在后台运行的新服务(或守护服务)的实现。

同一 ContainerGroup 中所有 ContainerWorker 共享 DaemonTask 的状态。所有与其中服务相关的事件始终广播到所有 DaemonTaskAttempt,原则上,为新 ContainerWorker 创建的 DaemonTaskAttempt 在启动时会收到此类事件的完整历史。因此,为了使所有 DaemonTaskAttempt 彼此保持最新状态,只需处理从 DaemonTask 发送的事件即可。
由于 DaemonTask 不是 MR3 DAG 的一部分,DaemonTaskAttempt 没有输入/输出 TaskAttempt,与 WorkerTaskAttempt 独立运行。但需要注意的是,DaemonTaskAttempt 仍然可以执行自己的 I/O 操作,如网络传输和磁盘访问。实际上,DaemonTaskAttempt 的典型用法是在 WorkerTaskAttempt 生成或使用中间数据的同时在后台执行 I/O。
ContainerWorker 在接受 WorkerTaskAttempt 之前启动 DaemonTaskAttempt。如果任何 DaemonTaskAttempt 初始化失败,则 ContainerWorker 本身会停止,因为后续的 WorkerTaskAttempt 期望由 DaemonTaskAttempt 提供服务。