我提到了this 链接,并对YARN如何运作有了公平的理解。 YARN能够运行多租户应用程序,例如MR,Spark等。
关键点是特定于应用程序的ApplicationMaster (AM)
。
当客户端将作业提交给资源管理器时,资源管理器如何知道它是什么类型的应用程序(MR,Spark)并因此启动适当的ApplicationMaster?
任何人都可以帮助RM了解提交给它的工作类型吗?
这个问题是:RM如何知道提交了什么类型的工作,而不知道YARN或MR或Spark之间的任何关系。
RM收到一个Job,因此它必须启动第一个运行特定应用程序ApplicationMaster的Container,因此RM如何知道哪个Job已经提交给它?
这是我要问的问题,这与被复制的内容不同。
答案 0 :(得分:3)
YARN不需要/想知道在其上运行的应用程序的类型。它提供资源,并且运行它的应用程序的关注点是理解如何从YARN获取资源以运行它需要运行的东西(YARN的架构并不表示 yarn想要知道运行什么/如何运行它)。
有关如何编写与纱线集成的组件的更多信息here。
正如我从2步YARN应用程序编写中所理解的那样,需要编写YARN客户端和YARN应用程序主服务器。
应用程序客户端确定要作为应用程序主机运行的内容:
// Construct the command to be executed on the launched container
String command =
"${JAVA_HOME}" + /bin/java" +
" MyAppMaster" +
" arg1 arg2 arg3" +
...
MyAppMaster
是特定于应用程序的主类。
第二件事是在容器中运行的任务,请注意应用程序主机提供的用于运行容器(运行实际任务执行程序)的命令类型:
// Set the necessary command to execute on the allocated container
String command = "/bin/sh ./MyExecShell.sh";
如您所见,这些是应用程序提供的代码,它们了解任务(或使用问题单词的应用程序类型)。 Further down在同一页面上,您可以看到如何将应用程序提交给纱线。
现在把它放在Spark的角度来看:Spark有自己的应用程序主类(检查here或the entire package)。这些对Spark应用程序开发人员是隐藏的,因为该框架提供了与YARN的内置集成,YARN恰好只是Spark支持的资源管理器之一。
如果您要编写自己的YARN客户端来执行Python代码,那么您必须按照YARN应用程序客户端/主文档步骤中的步骤操作,以便为YARN提供命令,配置,资源,以及用于执行应用程序特定逻辑或任务的环境。