에, 명령 줄에서 설정할. 우리는 클라이언트로부터의 모든 명령 행 인자를 자동적으로 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}
을 사용하여 또한 자동으로 사용자가 생략 notset1
my.client.arg1
경우 디폴트 값을 정의 할 수 있습니다. 우리는 스프링 부트에 의해 조정 된 Spring Application Context를 여기에서 작업하고 있습니다. 따라서 모든 유용한 것들이 처분 될 것입니다.
(args4j, jopt 등을 사용하여) 사용자 지향적 인 인수를보다 정확하게 제어해야한다면 커스텀 클라이언트 메인 메소드를 생성하기 위해 클라이언트/appmaster/container 명령을위한 별도의 코드/jar를 가질 필요가있다.다른 모든 Spring YARN Getting Started 가이드는 다중 프로젝트 빌드를 사용하고 있기 때문에 그러한 것들을 참조하십시오. 예를 들어 명령 행에서 전체 --my.client.arg1=arg1value
을 사용할 필요없이 첫 번째 및 두 번째 인수 값을 원한다면
이 방법이 효과가 있는지, 더 간단한 방법을 생각해보십시오.