Spring Boot Yarn - 传递命令行参数

时间:2014-07-17 18:28:01

标签: spring-boot spring-data-hadoop

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

访问它

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

1 个答案:

答案 0 :(得分:5)

当您找到spring.yarn.client.launchcontext.argumentsspring.yarn.appmaster.launchcontext.arguments时,您就非常接近。我们没有设置会自动将所有命令行参数从客户端传递到appmaster,然后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并使用@Valuemy.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:notset1},则使用格式notset1还可以自动定义默认值my.client.arg1。我们正在开发由Spring Boot精心编写的Spring Application Context,因此您可以随意使用所有好处

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

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