Spark 支持多种集群管理器(Cluster Manager),分别为:
Standalone:独立模式,Spark 原生的简单集群管理器,自带完整的服务,可单独部署到一个集群中,无需依赖任何其他资源管理系统,使用 Standalone 可以很方便地搭建一个集群;
Hadoop YARN:统一的资源管理机制,在上面可以运行多套计算框架,如 MR、Storm等。根据 Driver 在集群中的位置不同,分为 yarn client (集群外) 和 yarn cluster (集群内部)
Apache Mesos:一个强大的分布式资源管理框架,它允许多种不同的框架部署在其上,包括 Yarn。
K8S : 容器式部署环境。
实际上,除了上述这些通用的集群管理器外,Spark 内部也提供了方便用户测试和学习的本地集群部署模式和 Windows 环境。由于在实际工厂环境下使用的绝大多数的集群管理器是 Hadoop YARN,因此我们关注的重点是 Hadoop YARN 模式下的 Spark 集群部署。
1)执行脚本提交任务,实际是启动一个 SparkSubmit 的 JVM 进程;
2)SparkSubmit 类中的 main 方法反射调用 YarnClusterApplication 的 main 方法;
3)YarnClusterApplication 创建 Yarn 客户端,然后向 Yarn 服务器发送执行指令:bin/java ApplicationMaster
;
4)Yarn 框架收到指令后会在指定的 NM 中启动 ApplicationMaster;
5)ApplicationMaster 启动 Driver 线程,执行用户的作业;
6) AM 向 RM 注册,申请资源;
7) 获取资源后 AM 向 NM 发送指令:bin/java YarnCoarseGrainedExecutorBackend
;
8) CoarseGrainedExecutorBackend 进程会接收消息,跟 Driver 通信,注册已经启动的 Executor;然后启动计算对象 Executor 等待接收任务
9) Driver 线程继续执行完成作业的调度和任务的执行。
10) Driver 分配任务并监控任务的执行。
注意:SparkSubmit、ApplicationMaster 和 CoarseGrainedExecutorBackend 是独立的进程;Driver
是独立的线程;Executor 和 YarnClusterApplication 是对象。
1)执行脚本提交任务,实际是启动一个 SparkSubmit 的 JVM 进程;
2)SparkSubmit 类中的 main 方法反射调用用户代码的 main 方法;
3)启动 Driver 线程,执行用户的作业,并创建 ScheduleBackend;
4)YarnClientSchedulerBackend 向 RM 发送指令:bin/java ExecutorLauncher
;
5)Yarn 框架收到指令后会在指定的 NM 中启动 ExecutorLauncher(实际上还是调 ApplicationMaster 的 main 方法);
object ExecutorLauncher {
def main(args: Array[String]): Unit = {
ApplicationMaster.main(args)
}
}
6)AM 向 RM 注册,申请资源;
7)获取资源后 AM 向 NM 发送指令:bin/java CoarseGrainedExecutorBackend
;
8)CoarseGrainedExecutorBackend 进程会接收消息,跟 Driver 通信,注册已经启动的Executor;然后启动计算对象 Executor 等待接收任务
9)Driver 分配任务并监控任务的执行;
注意:SparkSubmit、ApplicationMaster 和 YarnCoarseGrainedExecutorBackend 是独立的进程;Executor 和 Driver 是对象。
Standalone 集群有 2 个重要组成部分,分别是:
在 Standalone Cluster 模式下,任务提交后,Master 会找到一个 Worker 启动 Driver。Driver 启动后向 Master 注册应用程序,Master 根据 submit 脚本的资源需求找到内部资源至少可以启动一个 Executor 的所有 Worker,然后在这些 Worker 之间分配 Executor,Worker 上的 Executor 启动后会向 Driver 反向注册,所有的 Executor 注册完成后,Driver 开始执行 main函数,之后执行到 Action 算子时,开始划分 Stage,每个 Stage 生成对应的 taskSet,之后将Task 分发到各个 Executor 上执行。
在 Standalone Client 模式下,Driver 在任务提交的本地机器上运行。Driver 启动后向 Master 注册应用程序,Master 根据 submit 脚本的资源需求找到内部资源至少可以启动一个Executor 的所有 Worker,然后在这些 Worker 之间分配 Executor,Worker 上的 Executor 启动后会向 Driver 反向注册,所有的 Executor 注册完成后,Driver 开始执行 main 函数,之后执行到 Action 算子时,开始划分 Stage,每个 Stage 生成对应的 TaskSet,之后将 Task 分发到各个 Executor 上执行。