[英]How does Spark prepare executors on Hadoop 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
,但内部没有发现任何有用的东西。
哎呀...您需要很多有关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:编写YARN应用程序以更深入地研究YARN内部。
提交Spark应用程序时,Spark的ApplicationMaster使用YARN“协议”提交给YARN,该协议要求对第一个YARN容器( 容器0 )的请求使用ContainerLaunchContext
,该ContainerLaunchContext
包含所有必要的启动详细信息(请参阅Client.createContainerLaunchContext )。
谁将文件交付给每个执行者
这就是YARN被告知如何启动Spark应用程序的ApplicationMaster
的方式。 在满足对ApplicationMaster容器的请求时,YARN下载在容器的工作空间中找到的必要文件。
这是任何 YARN应用程序在YARN上如何工作的本质,并且与Spark几乎(无关)无关。
负责通信的代码在Spark的Client
,尤其是。 Client.submitApplication 。
然后仅使用适当的类路径运行
CoarseGrainedExecutorBackend
。
引用掌握Apache Spark 2 gitbook:
CoarseGrainedExecutorBackend
是一个独立的应用程序,当在YARN的ExecutorRunnable
上启动(...)Spark时,将在资源容器中启动。
当YARN的YarnAllocator
上的Spark在分配的YARN资源容器中调度ExecutorRunnable
将启动ExecutorRunnable
。
什么是脚本? 它们都是YARN自动生成的吗?
的种类。
有些是由Spark准备的,作为Spark应用程序提交的一部分,而另一些则是特定于YARN的。
在您的Spark应用程序中启用DEBUG
日志记录级别,您将看到文件传输。
您可以在Spark官方文档的YARN上的Running Spark和我的Mastering Apache Spark 2 gitbook中找到更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.