你已经很接近这个当你发现spring.yarn.client.launchcontext.arguments
和spring.yarn.appmaster.launchcontext.arguments
。我们没有设置会自动将客户端的所有命令行参数传递给appmaster,然后将它们传递到容器启动上下文中。不知道我们是否希望这样做,因为您肯定想要控制YARN容器启动上下文中发生的情况。然后,使用客户端的用户可能会沿食物链传递流氓争论。
话虽如此,让我们看看我们可以用我们的Simple Single Project YARN Application Guide做什么。
我们仍然需要使用这些启动上下文参数来定义我们的命令行参数,以基本映射事情从客户端传递到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's reference docs中有更多使用方法。
然后,您可以修改AppIT
单元测试:
ApplicationInfo info = submitApplicationAndWait(Application.class, new String[]{"--my.client.arg1=arg1value"});
并运行测试,建立
./gradlew clean build
或只是建立它不运行测试:
./gradlew clean build -x test
,然后提交到一个真正的hadoop集群与您的my.client.arg1
。
你看到
arg1value
登录容器日志
java -jar build/libs/gs-yarn-basic-single-0.1.0.jar --my.client.arg1=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
如果my.client.arg1
由用户省略。我们正在研究Spring应用程序上下文,这里由Spring Boot精心安排,因此所有的好东西都在您的处置中
如果您需要更精确地控制那些面向用户的参数(使用args4j,jopt等),那么您会需要为客户端/ appmaster /容器订单分别创建一个代码/ jar来创建自定义客户端主要方法。所有其他Spring YARN入门指南几乎都使用多项目构建,因此请仔细阅读。例如,如果您只想拥有第一个和第二个参数值,而无需在命令行上使用完整的--my.client.arg1=arg1value
。
让我们知道这是否适用于您,如果您有任何其他想法可以使事情变得更简单。