我正在努力了解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
,但内心没有找到任何有用的东西。
答案 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 YARN和Hadoop: Writing YARN Applications,深入了解YARN内部。
在提交Spark应用程序时,Spark的ApplicationMaster使用YARN“协议”提交给YARN,该协议要求对第一个YARN容器(容器0 )的请求使用{{ 1}}包含所有必要的启动详细信息(请参阅Client.createContainerLaunchContext)。
谁将文件传递给每个执行者
这就是YARN告诉如何为Spark应用程序启动ContainerLaunchContext
的方法。在完成对ApplicationMaster容器的请求时,YARN会下载您在容器工作空间中找到的必要文件。
这是任何 YARN应用程序如何在YARN上运行并且(几乎)与Spark无关。
负责沟通的代码在Spark的ApplicationMaster
中,特别是。 Client.submitApplication
然后使用适当的类路径运行
Client
。
引用Mastering Apache Spark 2 gitbook:
当YARN的
CoarseGrainedExecutorBackend
是一个独立的应用程序,它在(...)YARN的CoarseGrainedExecutorBackend
上的Spark启动时在资源容器中启动。
ExecutorRunnable
上的Spark在分配的YARN资源容器中安排它时, ExecutorRunnable
启动。
什么是剧本?它们都是YARN自动生成的吗?
有点。
某些内容由Spark作为Spark应用程序提交的一部分准备,而其他则是YARN特定的。
在Spark应用程序中启用YarnAllocator
日志记录级别,您将看到文件传输。
您可以在Spark官方文档的Running Spark on YARN和我的Mastering Apache Spark 2 gitbook中找到更多信息。