spark 和 yarn 都是分布式框架,但作用不同:
Yarn 是一个资源管理框架,对于每个应用程序,它具有以下角色:
ApplicationMaster:单个应用程序的资源管理,包括从 Yarn 请求/释放资源用于应用程序和监视器。
尝试:尝试只是一个正常的过程,它完成了应用程序的整个工作的一部分。例如,一个由多个 mapper 和 reducer 组成的 mapreduce 作业,每个 mapper 和 reducer 都是一个 Attempt。
将应用程序升级到 yarn 的常见过程是:
客户端向 yarn 提交应用请求。在请求中,Yarn 应该知道 ApplicationMaster 类;对于 SparkApplication,它是
org.apache.spark.deploy.yarn.ApplicationMaster
,对于 MapReduce 作业,它是org.apache.hadoop.mapreduce.v2.app.MRAppMaster
。
Yarn 为 ApplicationMaster 进程分配一些资源,并在其中一个集群节点中启动 ApplicationMaster 进程;
ApplicationMaster 启动后,ApplicationMaster 会为这个Application 向Yarn 申请资源并启动worker;
对于分布式计算框架 Spark 来说,一个计算作业被分成许多小任务,每个 Executor 将负责每个任务,Driver 将收集所有 Executor 任务的结果并得到一个全局结果。Spark 应用程序只有一个驱动程序和多个执行程序。
那么,当 Spark 使用 Yarn 作为集群中的资源管理工具时,问题就来了:
在 Yarn Cluster 模式下,Spark 客户端会向 yarn 提交 Spark 应用程序,Spark Driver 和 Spark Executor 都在 yarn 的监督之下。在yarn看来,Spark Driver和Spark Executor没有区别,都是普通的java进程,即一个application worker进程。因此,当客户端进程消失时,例如客户端进程被终止或杀死,纱线上的 Spark 应用程序仍在运行。
在 yarn 客户端模式下,只有 Spark Executor 处于
yarn 的监督之下。Yarn ApplicationMaster 将为 spark executor 请求资源。驱动程序运行在与yarn无关的客户端进程中,只是一个向yarn提交应用程序的进程。因此,当客户端离开时,例如客户端
进程退出,驱动程序关闭,计算终止。