2014-07-17 147 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

讓我們知道這是否適用於您,如果您有任何其他想法可以使事情變得更簡單。