你已經很接近這個當你發現spring.yarn.client.launchcontext.arguments
和spring.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}
修改HelloPojo
在Application
類:
@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
和使用@Value
與my.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
。
讓我們知道這是否適用於您,如果您有任何其他想法可以使事情變得更簡單。