MR3Client
MR3Client 有两种类型:JobClient 和 SessionClient。
JobClient
JobClient(类 mr3.client.MR3JobClient)旨在为用户提交的每个 DAG 启动一个新的 DAGAppMaster。通常,用户创建一个 JobClient 来提交一个 DAG,随后 Yarn/Kubernetes 会创建一个新的 Application 来执行该 DAG。不过,用户也可以共享同一个 JobClient 来提交多个 DAG。在下面的图表中,JobClient 在开始时(start() 方法中)不会创建自己的 DAGAppMaster,因为没有需要执行的 DAG,只有在提交 DAG 时(submitDag() 方法中)才会创建新的 DAGAppMaster。
调用 MR3JobClient.start() 后

调用 MR3JobClient.submitDag() 后

由 JobClient 创建的 DAGAppMaster 以非会话模式运行,负责执行单个 DAG。因此,有多少个 DAGAppMaster 就有多少个 DAGClient。JobClient 可以随时安全终止,因为 Yarn/Kubernetes 会在集群资源可用时自动调度新的 Application。如果在 mr3-site.xml 中将 mr3.am.session.mode 设置为 false,则会创建 JobClient。
SessionClient
SessionClient 旨在在同一 DAGAppMaster 内执行多个 DAG。它从一开始就创建自己的 DAGAppMaster,所有后续提交的 DAG 都共享这个 DAGAppMaster。在下面的图表中,SessionClient 通过实例化 DAGClientRPC 对象(在 start() 方法中)建立与 DAGAppMaster 的连接,当提交新 DAG 时,它只需要创建一个新的 DAGClient(在 submitDag() 方法中)。
调用 MR3SessionClient.start() 后

调用 MR3SessionClient.submitDag() 后

由 SessionClient 创建的 DAGAppMaster 以会话模式运行,协调多个 DAG 的并发执行。SessionClient 不应该在执行 DAG 的过程中途终止,因为所有的 DAGClient 都会随之丢失。如果在 mr3-site.xml 中将 mr3.am.session.mode 设置为 true,则会创建 SessionClient。