3

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

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

4

1 回答 1

5

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,因此您可以使用所有的好东西notset1my.client.arg1

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

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

于 2014-07-18T08:51:51.077 回答