gpt4 book ai didi

spring-boot - Spring Boot Yarn - 传递命令行参数

转载 作者:行者123 更新时间:2023-12-04 02:59:46 25 4
gpt4 key购买 nike

我试图在我的 Spring Boot Yarn 应用程序中传递命令行参数,但遇到了困难。我知道我可以在 yml 文档 spring.yarn.appmaster.launchcontext.arguments 中设置这些但如何从命令行设置?像 java -jar MyYarnApp.jar {arg0} {arg1} 并从我的 @YarnContainer 访问它?

我发现 @YarnProperties 映射到 spring.yarn.appmaster.launchcontext.arguments 但我想从命令行设置它们,而不是在 yml 中

最佳答案

当您找到 spring.yarn.client.launchcontext.argumentsspring.yarn.appmaster.launchcontext.arguments 时,您就非常接近这个了。我们没有将所有命令行参数从客户端自动传递到 appmaster 然后将它们传递到容器启动上下文的设置。不确定我们是否想这样做,因为您肯定想控制 YARN 容器启动上下文发生的事情。使用客户端的用户可能会沿着食物链传递流氓参数。

话虽如此,让我们看看我们可以用我们的 Simple Single Project YARN Application Guide 做什么.

我们仍然需要使用这些启动上下文参数来定义我们的命令行参数,以基本上映射事物如何从客户端传递到应用程序管理器到容器中。

我在application.yml中添加的内容:

spring:
yarn:
client:
launchcontext:
arguments:
--my.appmaster.arg1: ${my.client.arg1:notset1}
appmaster:
launchcontext:
arguments:
--my.container.arg1: ${my.appmaster.arg1:notset2}

修改Application类中的HelloPojo:

@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

然后使用您的 my.client.arg1 提交到一个真正的 hadoop 集群。

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 被用户省略。我们正在处理由 Spring Boot 编排的 Spring Application Context,因此您可以随意使用那里的所有好东西

如果您需要更精确地控制那些面向用户的参数(使用 args4j、jopt 等),那么您需要为客户端/appmaster/容器顺序创建一个单独的代码/jar,以创建自定义客户端主要方法。所有其他的 Spring YARN 入门指南几乎都是使用多项目构建,所以看看那些。例如,如果您只想拥有第一个和第二个参数值而无需在命令行上使用完整的 --my.client.arg1=arg1value

让我们知道这是否适合您,以及您是否有任何其他想法可以使事情变得更简单。

关于spring-boot - Spring Boot Yarn - 传递命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24810935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com