Spark的部署模式详解
1. Spark的部署模式
在介绍Spark的部署模式之前,需要明确两个重要的角色:Driver(驱动器)、Executor(执行器)。
1.1 Driver(驱动器)
Spark的驱动器是执行开发程序中的main方法的进程。它负责开发人员编写的用来创建SparkContext、创建RDD,以及进行RDD的转化(transform)操作和行动(action)操作代码的执行。如果你是用spark shell,那么当你启动Spark shell的时候,系统后台自启了一个Spark驱动器程序,就是在Spark shell中预加载的一个叫作 SC的SparkContext对象(在分析源码的时候,关注SC能够帮助分析Driver的各个工作阶段)。如果驱动器程序终止,那么Spark应用也就结束了。
主要负责:
- 将用户程序转化成Job(负责Job的分配和Submit)
- 监控和调度Executor的运行
- UI展示运行状况(http://localhost:4040,端口号刚好是Tomcat默认的8080的一半)
1.2 Executor(执行器)
**Spark Executor是一个工作进程,负责在 Spark 作业中运行任务,任务间相互独立,负责Spark的算子执行。**Spark 应用启动时,Executor节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。
主要负责:
- 运行Driver分配的任务,并将结果返回给Driver。
- 通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
1.3 Spark的三种部署模式
Spark具有Local模型(本地单机模式)、Standalone模式(采用Spark自带的集群管理模式)、Yarn模式(使用Hadoop中的Yarn来实现集群资源管理)。下面就这三种模式进行详细介绍。
2. Local模式
Local模式主要用于本地调试。在Local模式中,对于工作流程的描述采用的主要概念是Driver和Executor。具体工作流程如下图:
从图中可以看出,Driver和Executor完成了主要的任务。Driver负责任务的初始化、划分和调度;Executor负责执行具体的Spark算子。
3. Standalone模式
Standalone模式主要是Spark自带的集群部署模式。在Standalone模式中,对于工作流程的描述采用的主要概念是Master和Worker。具体工作流程如下图:
从图中可以看出,Client相当于Driver,Master相当于Local模式中的资源管理者,Worker相当于Executor(这里依旧采用了Executor的概念,只不过是用Worker将Executor包装了)。
4. Yarn模式
Yarn模式相比Standalone模式更加成熟可靠,可以直接在已有的集群中部署并使用集群资源。Spark on Yarn主要有如下优点:
- Spark支持资源动态共享,运行于Yarn的框架都共享一个集中配置好的资源池
- 可以很方便的利用Yarn的资源调度特性来做分类·,隔离以及优先级控制负载,拥有更灵活的调度策略
- Yarn可以自由地选择executor数量
- Yarn是唯一支持Spark安全的集群管理器,使用Yarn,Spark可以运行于Kerberized Hadoop之上,在它们进程之间进行安全认证
Spark客户端直接连接Yarn,不需要额外构建Spark集群。有Yarn-Client和Yarn-Cluster两种模式,主要区别在于:Driver程序的运行节点。
- Yarn-Client:Driver程序运行在客户端(指的是提交Spark应用程序的主机),适用于交互、调试,希望立即看到app的输出。
- Yarn-Cluster:Driver程序运行在由RM(ResourceManager,由集群制定,不一定是本机)启动的AP(APPMaster)适用于生产环境。
对比本机和Standalone模式,有如下对应关系:
本机模式 | Standalone模式 | Yarn模式 |
资源管理者 | Master | RM |
Worker | NM | |
Driver | Client | AM |
Executor | Executor | Container |
为了更好的理解这两种模式的区别先了解下Yarn的Application Master概念,在Yarn中,每个application都有一个Application Master进程,它是Appliaction启动的第一个容器,它负责从ResourceManager中申请资源,分配资源,同时通知NodeManager来为Application启动container,Application Master避免了需要一个活动的client(driver)来维持,启动Applicatin的client可以随时退出,而由Yarn管理的进程继续在集群中运行。
4.1 Yarn-Cluster模式
在Yarn-cluster模式下,driver运行在Appliaction Master上,Appliaction Master进程同时负责驱动Application和从Yarn中申请资源,该进程运行在Yarn container内,所以启动Application Master的client可以立即关闭而不必持续到Application的生命周期,下图是yarn-cluster模式:
Yarn-Cluster模式下的作业流程如下:
- 客户端生成作业信息提交给ResourceManager(RM)
- RM在某一个NodeManager(由Yarn决定)启动container并将Application Master(AM)分配给该NodeManager(NM)
- NM接收到RM的分配,启动Application Master并初始化作业,此时这个NM就称为Driver
- Application向RM申请资源,分配资源同时通知其他NodeManager启动相应的Executor
- Executor向NM上的Application Master注册汇报并完成相应的任务
4.2 Yarn-Client模式
Yarn-Client模式的结构与Yarn-Cluster是一致的,只是在任务提交后,Client不退出(在Yarn模式下,Client可以退出,但是不一定要退出啊)。作业提交后,Client会跟container通信进行作业的调度。
Yarn-Client模式下的作业流程如下:
- 本地提交任务给ResourceManager(RM)
- RM 在本地NM(提交任务的节点)启动ApplicationMaster(AM)并分配给该NM
- NM收到RM的分配,启动AM并初始化作业,这个NM(也称Client)就称为Driver(Driver并没有运行在AM上)
- AM向RM申请资源,分配资源的同时启动相应的Executor
- Executor向本地启动的Application Master注册汇报并完成相应的任务
4.3 总结
Yarn-Cluster mode
Spark的dirver 运行在 appMaster中,appMaster进程同时负责driving app,请求资源;
启动spark app的client不需要一直存在于整个spark app运行生命周期
Yarn-Client mode
某些情况需要与spark交互,要求user input,如spark-shell和pyspark,这样的spark app需要spark-driver运行在初始化spark app的client端进程中
这种情况,appMaster仅仅用于从yarn集群请求executor,app client(此时的作用相当于Driver)会和请求的container通信来调度他们工作