DAGAppMaster 和 ContainerWorker 模式
DAGAppMaster 以以下四种模式之一运行:
- LocalThread 模式:DAGAppMaster 在 MR3Client 内部作为新线程启动。
- LocalProcess 模式:DAGAppMaster 在与 MR3Client 相同的机器上作为新进程启动。
- Yarn 模式:DAGAppMaster 在 Hadoop 集群中作为新容器启动。
- Kubernetes 模式:DAGAppMaster 在 Kubernetes 集群中作为 Pod 启动。
ContainerWorker 以以下四种模式之一运行:
- Local 模式:ContainerWorker 在 DAGAppMaster 内部作为线程启动。
- Yarn 模式:ContainerWorker 在 Hadoop 集群中作为容器启动。
- Kubernetes 模式:ContainerWorker 在 Kubernetes 集群中作为 Pod 启动。
- Process 模式:ContainerWorker 作为普通进程启动。
DAGAppMaster 和 ContainerWorker 模式的组合
MR3 支持 DAGAppMaster 和 ContainerWorker 模式的多种组合。例如,LocalProcess 模式允许我们在 Hadoop 集群外的专用机器上运行 DAGAppMaster(作为非托管 ApplicationMaster),这在同一个 DAGAppMaster 中运行许多并发 DAG 时特别有用。另一个例子,运行在 Yarn 模式下的 DAGAppMaster 可以使其 ContainerWorker 以 Local 模式运行,类似于 Hadoop 的 Uber 模式。此外,DAGAppMaster 可以混合使用不同模式的 ContainerWorker。例如,长时间运行的 ContainerWorker 可以采用 Yarn 模式运行,而短生命周期的 ContainerWorker 可以采用 Local 模式运行。
下表列出了 MR3 允许的所有组合。对于 Kubernetes 集群中的 LocalProcess 模式,DAGAppMaster 应该运行在 Kubernetes 集群内部。
| 集群 | DAGAppMaster | ContainerWorker |
|---|---|---|
| Hadoop/Kubernetes/Standalone | LocalThread | Local |
| Hadoop/Kubernetes/Standalone | LocalProcess | Local |
| Hadoop | LocalThread | Yarn |
| Hadoop | LocalProcess | Yarn |
| Hadoop | Yarn | Local |
| Hadoop | Yarn | Yarn |
| Kubernetes | LocalThread | Kubernetes |
| Kubernetes | LocalProcess(仅在集群内部) | Kubernetes |
| Kubernetes | Kubernetes | Local |
| Kubernetes | Kubernetes | Kubernetes |
| Standalone | LocalThread | Process |
| Standalone | LocalProcess | Process |
在 Hadoop 上
以下是 Hadoop 集群中六种组合的示意图:
-
DAGAppMaster 采用 LocalThread 模式,ContainerWorker 采用 Local 模式

-
DAGAppMaster 采用 LocalProcess 模式,ContainerWorker 采用 Local 模式

-
DAGAppMaster 采用 Yarn 模式,ContainerWorker 采用 Local 模式

-
DAGAppMaster 采用 LocalThread 模式,ContainerWorker 采用 Yarn 模式

-
DAGAppMaster 采用 LocalProcess 模式,ContainerWorker 采用 Yarn 模式

-
DAGAppMaster 采用 Yarn 模式,ContainerWorker 采用 Yarn 模式

在 Kubernetes 上
以下是 Kubernetes 上六种组合的示意图,我们假设使用 HivePlus。在当前实现中,HiveServer2 始终在 Pod 中启动。
-
DAGAppMaster 采用 LocalThread 模式,ContainerWorker 采用 Local 模式

-
DAGAppMaster 采用 LocalThread 模式,ContainerWorker 采用 Kubernetes 模式

-
DAGAppMaster 采用 LocalProcess 模式,ContainerWorker 采用 Local 模式

-
DAGAppMaster 采用 LocalProcess 模式,ContainerWorker 采用 Kubernetes 模式

-
DAGAppMaster 采用 Kubernetes 模式,ContainerWorker 采用 Local 模式

-
DAGAppMaster 采用 Kubernetes 模式,ContainerWorker 采用 Kubernetes 模式

指定 DAGAppMaster/ContainerWorker 模式
DAGAppMaster 模式可以通过 mr3-site.xml 中的配置键 mr3.master.mode 来指定:
- LocalThread 模式:
mr3.master.mode=local-thread - LocalProcess 模式:
mr3.master.mode=local-process - Yarn 模式:
mr3.master.mode=yarn - Kubernetes 模式:
mr3.master.mode=kubernetes
ContainerWorker 模式可以通过 mr3-site.xml 中的配置键 mr3.am.worker.mode 来指定:
- Local 模式:
mr3.am.worker.mode=local。在这种情况下,所有 ContainerWorker 都以 Local 模式运行。 - Yarn 模式:
mr3.am.worker.mode=yarn。在这种情况下,ContainerWorker 可以运行在 Local 或 Yarn 模式(由其 ContainerGroup 决定)。 - Kubernetes 模式:
mr3.am.worker.mode=kubernetes。在这种情况下,ContainerWorker 可以运行在 Local 或 Kubernetes 模式(由其 ContainerGroup 决定)。 - Process 模式:
mr3.am.worker.mode=process。在这种情况下,ContainerWorker 可以运行在 Local 或 Process 模式(由其 ContainerGroup 决定)。
安全 Hadoop 集群中不支持 LocalThread/LocalProcess 模式
一个值得注意的限制是,DAGAppMaster 无法在启用 Kerberos 的安全 Hadoop 集群中以 LocalThread 或 LocalProcess 模式启动。这与其说是 MR3 的限制,不如说是 Yarn 中的一个缺失功能(YARN-2892),该功能对于非托管 ApplicationMaster 检索 AMRMToken 是必需的。因此,用户不应在安全 Hadoop 集群中以 LocalThread 或 LocalProcess 模式启动 DAGAppMaster。(在 HivePlus 中,不要在安全集群中使用 --amprocess 选项。)如果 DAGAppMaster 应该在安全 Hadoop 集群中以 LocalThread 或 LocalProcess 模式启动,则 ContainerWorker 应该仅以 Local 模式运行。