spring.yarn.client.launchcontext.arguments
当您发现and时,您对此非常接近spring.yarn.appmaster.launchcontext.arguments
。我们没有设置会自动将所有命令行参数从客户端传递到 appmaster,然后 appmaster 会将它们传递到容器启动上下文中。不确定我们是否想要这样做,因为您肯定想控制 YARN 容器启动上下文发生的情况。然后,使用客户端的用户可能会沿着食物链传递流氓参数。
话虽如此,让我们看看我们可以用我们的简单单项目 YARN 应用指南做什么。
我们仍然需要使用这些启动上下文参数来定义我们的命令行参数,以基本上映射事物是如何从客户端传递到 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
课堂修改Application
:
@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
或者@Value
是普通的 Spring 和 Spring Boot 功能,并且在Boot 的参考文档中还有更多如何使用这些功能。
然后您可以修改AppIT
单元测试:
ApplicationInfo info = submitApplicationAndWait(Application.class, new String[]{"--my.client.arg1=arg1value"});
并使用测试运行构建
./gradlew clean build
或者只是在不运行测试的情况下构建它:
./gradlew clean build -x test
然后使用您的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}
还允许您自动定义默认值。我们正在处理由 Spring Boot 编排的 Spring Application Context,因此您可以使用所有的好东西notset1
my.client.arg1
如果您需要更精确地控制这些面向用户的参数(使用 args4j、jopt 等),那么您需要有一个单独的代码/jar 用于 client/appmaster/container 订单来创建自定义客户端主方法。所有其他 Spring YARN 入门指南几乎都在使用多项目构建,所以看看那些。例如,如果您只想拥有第一个和第二个参数值而无需--my.client.arg1=arg1value
在命令行上使用 full。
让我们知道这是否适合您,以及您是否有任何其他想法可以让事情变得更简单。