2014-07-17 2 views
2

스프링 부트 원사 응용 프로그램에서 명령 줄 인수를 전달하려고하는데 문제가 있습니다. 나는 yml 문서 spring.yarn.appmaster.launchcontext.arguments에서 이것을 설정할 수 있다고 생각하지만 명령 행에서 어떻게 할 수 있습니까? java -jar MyYarnApp.jar {arg0} {arg1}처럼 내 @YarnContainer에서 액세스 할 수 있나요?스프링 부트 원사 - 전달 명령 줄 인수

내가 @YarnPropertiesspring.yarn.appmaster.launchcontext.arguments에 매핑 것을 발견했습니다하지만 난 당신이 spring.yarn.client.launchcontext.argumentsspring.yarn.appmaster.launchcontext.arguments 발견했을 때 당신이 꽤 가까이하지 YML

답변

4

에, 명령 줄에서 설정할. 우리는 클라이언트로부터의 모든 명령 행 인자를 자동적으로 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} 

Application 클래스 HelloPojo를 수정 : 나는 arg1을 추가 my.container.arg1로 매핑하는 @Value을 사용하는 방법

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

} 

공지 사항. 우리는 @ConfigurationProperties 또는 @Value을 사용할 수 있습니다. 이는 일반적인 스프링 및 스프링 부트 기능이며 Boot's reference docs에는 그 사용 방법이 더 있습니다. 에 제출 한 후

./gradlew clean build -x test 

과 :

그런 다음 AppIT 단위 테스트를 수정할 수 :

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

을 실행 테스트를

./gradlew clean build 

을 구축하거나 테스트를 실행하지 않고 그것을 구축 너의 my.client.arg1와 함께 진짜 hadoop 클러스터. 당신이 컨테이너 로그에 기록 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}을 사용하여 또한 자동으로 사용자가 생략 notset1my.client.arg1 경우 디폴트 값을 정의 할 수 있습니다. 우리는 스프링 부트에 의해 조정 된 Spring Application Context를 여기에서 작업하고 있습니다. 따라서 모든 유용한 것들이 처분 될 것입니다.

(args4j, jopt 등을 사용하여) 사용자 지향적 인 인수를보다 정확하게 제어해야한다면 커스텀 클라이언트 메인 메소드를 생성하기 위해 클라이언트/appmaster/container 명령을위한 별도의 코드/jar를 가질 필요가있다.다른 모든 Spring YARN Getting Started 가이드는 다중 프로젝트 빌드를 사용하고 있기 때문에 그러한 것들을 참조하십시오. 예를 들어 명령 행에서 전체 --my.client.arg1=arg1value을 사용할 필요없이 첫 번째 및 두 번째 인수 값을 원한다면

이 방법이 효과가 있는지, 더 간단한 방법을 생각해보십시오.