Spark如何在Hadoop YARN上准备执行程序?

时间:2017-12-08 07:59:27

标签: apache-spark yarn

我正在努力了解Spark如何准备执行程序的细节。为了做到这一点,我尝试调试org.apache.spark.executor.CoarseGrainedExecutorBackend并调用

Thread.currentThread().getContextClassLoader.getResource("")

它指出以下目录:

/hadoop/yarn/local/usercache/_MY_USER_NAME_/appcache/application_1507907717252_15771/container_1507907717252_15771_01_000002/

查看目录,我找到了以下文件:

default_container_executor_session.sh
default_container_executor.sh
launch_container.sh
__spark_conf__
__spark_libs__

问题是谁将文件传递给每个执行程序,然后只使用适当的类路径运行CoarseGrainedExecutorBackend?什么是剧本?它们都是YARN自动生成的吗?

我看了org.apache.spark.deploy.SparkSubmit,但内心没有找到任何有用的东西。

1 个答案:

答案 0 :(得分:4)

哎呀......你要求提供很多关于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 YARNHadoop: Writing YARN Applications,深入了解YARN内部。

在提交Spark应用程序时,Spark的ApplicationMaster使用YARN“协议”提交给YARN,该协议要求对第一个YARN容器(容器0 )的请求使用{{ 1}}包含所有必要的启动详细信息(请参阅Client.createContainerLaunchContext)。

enter image description here

  

谁将文件传递给每个执行者

这就是YARN告诉如何为Spark应用程序启动ContainerLaunchContext的方法。在完成对ApplicationMaster容器的请求时,YARN会下载您在容器工作空间中找到的必要文件。

这是任何 YARN应用程序如何在YARN上运行并且(几乎)与Spark无关。

负责沟通的代码在Spark的ApplicationMaster中,特别是。 Client.submitApplication

enter image description here

  

然后使用适当的类路径运行Client

引用Mastering Apache Spark 2 gitbook:

  

CoarseGrainedExecutorBackend是一个独立的应用程序,它在(...)YARN的CoarseGrainedExecutorBackend上的Spark启动时在资源容器中启动。

当YARN的ExecutorRunnable上的Spark在分配的YARN资源容器中安排它时,

ExecutorRunnable启动。

enter image description here

  

什么是剧本?它们都是YARN自动生成的吗?

有点。

某些内容由Spark作为Spark应用程序提交的一部分准备,而其他则是YARN特定的。

在Spark应用程序中启用YarnAllocator日志记录级别,您将看到文件传输。

您可以在Spark官方文档的Running Spark on YARN和我的Mastering Apache Spark 2 gitbook中找到更多信息。