不同的运行模式的主要区别就是他们有自己特定的资源分配和任务调度模块,这些模块用来执行实际的计算任务。
常用spark-submit提交spark application 格式如下
submit可选参数如下:
standalone模式:资源调度是spark框架自己实现,节点分为master和worker节点
如果是运行spark-shell等交互式的运行spark任务,那么driver运行在master节点,如果使用spark-submit工具进行任务提交或者在eclipse idea开发平台上使用new SparkContext("spark://master:7077","appname")方式,driver运行在本地客户端
Worker节点通过ExecutorRunner控制运行在当前节点的CoarseGainedexecuatorBackend(粗粒度执行器后台),每个CoarseGainedexecuatorBackend进程包含一个Executor对象,该对象持有一个线程池,每个线程运行一个task
standlone是master-slaves架构的集群模式,存在master单点故障问题,解决方式:1基于文件系统 master进程挂掉后直接重启
2 基于zookeeper的HA方式 activemaster挂掉后standby接替
Spark appliction运行的主要流程(spark-submit模式):
1 客户端启动,初始化相关的环境变量,包括提交的application代码的提交
2 反射调用org.apache.spark.deploy.yarn.Client,创建DriverActor(其他方式提交,Driver可能运行在Worker节点中)
3 向Master注册Driver
4 Driver初始化SparkContext DAGScheduler TaskScheduler等
5 DAGScheduler 向Master 注册 application,master接收请求后,根据资源情况向worker发送指令启动executor,,executor启动后向driver注册
6 DAGScheduler进行Job的Stage划分
7 DAGScheduler提交作业给TaskScheduler
8 TaskScheduler 向注册的Executor发送Launch Task命令
9 Executor端进行Task相关信息的反序列化,相关jar包的下载和配置文件的下载,并运行。
10 如果运行的shuffleMapTask,将结果保存到本地文件中,汇报给Driver等待ResultTask或者其他ShuffleMapTask获取
11 ResultTask根据Driver中提供的信息进行结果的获取和reduce,最后结果汇报给Driver。
12 运行结束
standalone on mesos,yarn在很多细节上有相同和相似之处。
Yarn-Cluster模式
将spark application部署到yarn中,有以下优点:1 部署application和服务更加方便 spark经由客户端提交后,由yarn提供的分布式缓存机制分发到各个计算节点上 2 资源隔离 yarn只负责资源的管理和调度 3资源弹性管理 可以通过队列管理听同时运行在yarn集群中的各个服务,并根据不同类型应用程序的压力,调整对应的资源使用。
yarn-cluster:客户端通过yarn client的api,把spark driver作为一个applicationMaster在yarn集群中先启动,然后再由ApllicationMaster 向resourceManager申请资源,进一步来启动executor以运行Task。
部署的时候仅需要可以提交给spark application到yarn集群的一个节点(一台客户端)即可,不用每台都部署spark。在客户端配置文件中需要设置yarn和HDFS的相关属性,spark本身的worker节点 master节点不需要启动。
spark application提交步骤: 1客户端向yarn提交spark application,提交的工具可以是spark-submit等。 2 ResourceManager接收到请求后,为application分配第一个container,用来运行applicationmaster,applicationmaster包含sparkcontext的初始化。
3 applicationmaster向resourcemanager申请资源以运行executor。 4 resourcemanager分配container给applicationmaster,application master和相关的nodemanager通信,在获得的container上启动coarsegainedexecutorBackend,coarsegainedexecutorBackend启动后开始向application master中的sparkcontext注册并申请task
5 applicationmaster中的sparkcontext分配给task给coarseGrainedExecutorBackend执行,coarseGrainedExecutorBackend运行task并向spark context汇报运行情况
yarn-client模式
driver运行在客户端本地
提交步骤:1 客户端向yarn提交spark application 2 resourcemanager接收到请求后为application分配第一个container用来运行applicationmaster,这里的applicationmaster指的是executorlauncher,他不包括driver,只负责启动executor和客户端的driver进行通信 3 executorlauncher向resoucemanager申请资源以运行executor。 4 resourcemanager分配container给executorlanucher,executor和相关的nodemanager进行通信,在获得的container上启动CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend向客户端的driver中的sparkcontext注册并申请task
5 运行在客户端的sparkcontext分配task给coarsegrainedexecutor-backend执行,并汇报运行情况
此博客参考了《大数据Spark企业级实战版》大家可以购买此书 强力推荐