有两种模式:cluster 和 driver
区别:
cluster 模式:Driver 程序在 YARN 中运行,应用的运行结果不能在客户端显示,所以最好运行那些将结果最终保存在外部存储介质(如 HDFS、Redis、Mysql)而非 stdout 输出的应用程序,客户端的终端显示的仅是作为 YARN 的 job的简单运行状况。
client 模式:Driver 运行在 Client 上,应用程序运行结果会在客户端显示,所有适合运行结果有输出的应用程序(如
spark-shell)
Cluster 模式流程:
Spark Driver 首先作为一个 ApplicationMaster 在 YARN 集群中启动,客户端提交给 ResourceManager 的每一个 job 都会在集群的 NodeManager 节点上分配一个唯一的 ApplicationMaster,由该 ApplicationMaster 管理全生命周期的应用。
具体过程:
1. 由 client 向 ResourceManager 提交请求,并上传 jar 到 HDFS 上
这期间包括四个步骤:
a).连接到 RM
b).从 RM 的 ASM(ApplicationsManager )中获得 metric、queue 和 resource 等信息。
c). upload app jar and spark-assembly jar
d).设置运行环境和 container 上下文(launch-container.sh 等脚本)
2. ResouceManager 向 NodeManager 申 请 资 源 , 创 建 Spark ApplicationMaster ( 每 个 SparkContext 都 有 一 个ApplicationMaster)
3. NodeManager 启动 ApplicationMaster,并向 ResourceManager AsM 注册
4. ApplicationMaster 从 HDFS 中找到 jar 文件,启动 SparkContext、DAGscheduler 和 YARN Cluster Scheduler
5. ResourceManager 向 ResourceManager AsM 注册申请 container 资源
6. ResourceManager 通知 NodeManager 分配 Container,这时可以收到来自 ASM 关于 container 的报告。(每个 container对应一个 executor)
7. Spark ApplicationMaster 直接和 container(executor)进行交互,完成这个分布式任务。
如果使用 spark on yarn 提交任务,一般情况,都使用 cluster 模式,该模式,Driver 运行在集群中,其实就是运行在ApplicattionMaster 这个进程成,如果该进程出现问题,yarn 会重启 ApplicattionMaster(Driver),SparkSubmit 的功能就是为了提交任务。