当您发现时,您已经非常接近这一点了spring.yarn.client.launchcontext.arguments
and spring.yarn.appmaster.launchcontext.arguments
。我们没有设置可以自动将所有命令行参数从客户端传递到 appmaster,然后 appmaster 将它们传递到容器启动上下文。不确定我们是否想这样做,因为您肯定希望控制 YARN 容器启动上下文中发生的情况。使用客户端的用户可能会沿着食物链传递流氓争论。
话虽如此,让我们看看我们可以用我们的简单单项目 YARN 应用指南 https://spring.io/guides/gs/yarn-basic-single.
我们仍然需要使用这些启动上下文参数来定义命令行参数,以基本上映射事物如何从客户端传递到 appmaster 到容器中。
我在application.yml中添加的内容:
spring:
yarn:
client:
launchcontext:
arguments:
--my.appmaster.arg1: ${my.client.arg1:notset1}
appmaster:
launchcontext:
arguments:
--my.container.arg1: ${my.appmaster.arg1:notset2}
修改的HelloPojo
in Application
class:
@YarnComponent
@Profile("container")
public static class HelloPojo {
private static final Log log = LogFactory.getLog(HelloPojo.class);
@Autowired
private Configuration configuration;
@Value("${my.container.arg1}")
private String arg1;
@OnContainerStart
public void onStart() throws Exception {
log.info("Hello from HelloPojo");
log.info("Container arg1 value is " + arg1);
log.info("About to list from hdfs root content");
FsShell shell = new FsShell(configuration);
for (FileStatus s : shell.ls(false, "/")) {
log.info(s);
}
shell.close();
}
}
注意我是如何添加的arg1
并使用@Value
来映射它my.container.arg1
。我们可以使用@ConfigurationProperties
or @Value
这是正常的 Spring 和 Spring Boot 功能,还有更多功能Boot 的参考文档 http://projects.spring.io/spring-boot如何使用这些。
然后你可以修改AppIT
单元测试:
ApplicationInfo info = submitApplicationAndWait(Application.class, new String[]{"--my.client.arg1=arg1value"});
并通过测试运行构建
./gradlew clean build
或者只是构建它而不运行测试:
./gradlew clean build -x test
然后用你的提交到一个真正的hadoop集群my.client.arg1
.
java -jar build/libs/gs-yarn-basic-single-0.1.0.jar --my.client.arg1=arg1value
无论哪种方式你都看到arg1value
登录容器日志:
[2014-07-18 08:49:09.802] boot - 2003 INFO [main] --- ContainerLauncherRunner: Running YarnContainer with parameters [--spring.profiles.active=container,--my.container.arg1=arg1value]
[2014-07-18 08:49:09.806] boot - 2003 INFO [main] --- Application$HelloPojo: Container arg1 value is arg1value
使用格式${my.client.arg1:notset1}
还允许您自动定义默认值notset1
if my.client.arg1
被用户省略。我们正在研究由 Spring Boot 精心策划的 Spring 应用程序上下文,因此您可以使用其中的所有好东西
如果您需要更精确地控制那些面向用户的参数(使用 args4j、jopt 等),那么您需要为 client/appmaster/container 订单提供单独的代码/jar 来创建自定义客户端主方法。所有其他 Spring YARN 入门指南几乎都使用多项目构建,因此请查看这些指南。例如,如果您只想拥有第一个和第二个参数值,而不需要使用完整的--my.client.arg1=arg1value
在命令行上。
请告诉我们这是否适合您,以及您是否有任何其他想法可以让事情变得更简单。