2014-07-17 186 views
2

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

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

回答

4

你已经很接近这个当你发现spring.yarn.client.launchcontext.argumentsspring.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} 

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

} 

通知我如何添加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 

,然后提交到一个真正的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

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