Spring Boot Yarn - 传递命令行参数

inc*_*.de 3 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中设置它们

Jan*_*hti 5

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

话虽如此,让我们看看我们可以用Simple Single Project 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}
Run Code Online (Sandbox Code Playgroud)

HelloPojoApplication课堂上修改:

@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();
    }

}
Run Code Online (Sandbox Code Playgroud)

注意我是如何添加arg1和用于@Value映射它的my.container.arg1.我们可以使用@ConfigurationProperties或者使用@Value哪些是正常的Spring和Spring Boot功能,而Boot的参考文档中还有更多如何使用它们.

然后,您可以修改AppIT单元测试:

ApplicationInfo info = submitApplicationAndWait(Application.class, new String[]{"--my.client.arg1=arg1value"});
Run Code Online (Sandbox Code Playgroud)

并使用测试运行构建

./gradlew clean build
Run Code Online (Sandbox Code Playgroud)

或者只是构建它而不运行测试:

./gradlew clean build -x test
Run Code Online (Sandbox Code Playgroud)

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

java -jar build/libs/gs-yarn-basic-single-0.1.0.jar --my.client.arg1=arg1value
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,您都会看到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
Run Code Online (Sandbox Code Playgroud)

如果用户省略,使用格式${my.client.arg1:notset1}还允许您自动定义默认值.我们正在开发由Spring Boot精心编写的Spring Application Context,因此您可以随意使用所有好东西notset1my.client.arg1

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

如果这对您有用,并且您有任何其他想法可以使事情变得更简单,请告诉我们.