哎呀...您要求提供很多关于 Spark 在请求资源时如何与集群管理器通信的详细信息。让我给你一些信息。继续询问您是否想要更多...
您正在使用 Hadoop YARN 作为 Spark 应用程序的集群管理器。让我们只关注这个特定的集群管理器(因为 Spark 支持的其他集群管理器,例如 Apache Mesos、Spark Standalone、DC/OS 和即将推出的 Kubernetes,它们都有自己的方式来处理 Spark 部署)。
默认情况下,在使用 spark-submit 提交 Spark 应用程序时,Spark 应用程序(即它实际使用的 SparkContext)请求三个 YARN 容器。一个容器用于该 Spark 应用程序的 ApplicationMaster,它知道如何与 YARN 通信并为两个 Spark 执行程序请求另外两个 YARN 容器。
您可以查看 YARN 官方文档的 Apache Hadoop YARN 和 Hadoop: Writing YARN Applications 以深入了解 YARN 内部结构。
在提交 Spark 应用程序时,Spark 的 ApplicationMaster 使用 YARN“协议”提交给 YARN,该协议要求对第一个 YARN 容器(container 0)的请求使用 ContainerLaunchContext包含所有必要的启动详细信息(请参阅Client.createContainerLaunchContext)。
谁将文件交付给每个执行者
这就是 YARN 被告知如何为 Spark 应用程序启动 ApplicationMaster 的方式。在满足对 ApplicationMaster 容器的请求时,YARN 会下载您在容器工作空间中找到的必要文件。
这对于任何 YARN 应用程序如何在 YARN 上运行非常内部,并且(几乎)与 Spark 无关。
负责通信的代码在 Spark 的Client 中,尤其是。 Client.submitApplication.
然后使用适当的类路径运行CoarseGrainedExecutorBackend。
引用Mastering Apache Spark 2gitbook:
CoarseGrainedExecutorBackend 是一个独立的应用程序,当 (...) Spark on YARN 的 ExecutorRunnable 启动时,它会在资源容器中启动。
ExecutorRunnable 在 YARN 的 YarnAllocator 上的 Spark 将其调度到已分配的 YARN 资源容器中时启动。
什么是脚本?它们都是 YARN 自动生成的吗?
有点。
一些是 Spark 准备的,作为 Spark 应用程序提交的一部分,而另一些则是 YARN 特定的。
在您的 Spark 应用程序中启用 DEBUG 日志记录级别,您将看到文件传输。
您可以在 Spark 官方文档的Running Spark on YARN 和我的Mastering Apache Spark 2 gitbook 中找到更多信息。