Spring Boot Yarn - Передача аргументов командной строки
Я пытаюсь передать аргументы командной строки в приложении Spring Boot Yarn, и у меня возникли трудности. я понимаю, что могу установить их в документе YML spring.yarn.appmaster.launchcontext.arguments
а как это можно из командной строки? лайк java -jar MyYarnApp.jar {arg0} {arg1}
и получить доступ к нему от моего @YarnContainer
?
я обнаружил, что @YarnProperties
карты для spring.yarn.appmaster.launchcontext.arguments
но я хочу установить их из командной строки, а не в YML
1 ответ
Вы довольно близки к этому, когда вы нашли spring.yarn.client.launchcontext.arguments
а также spring.yarn.appmaster.launchcontext.arguments
, У нас нет настроек, которые бы автоматически передавали все аргументы командной строки от клиента в мастер приложений, который затем передавал бы их в контекст запуска контейнера. Не уверен, что мы даже хотим сделать это, потому что вы наверняка хотите контролировать то, что происходит с контекстом запуска контейнера YARN. Пользователь, использующий клиента, мог бы затем передать ложные аргументы по пищевой цепочке.
Сказав это, давайте посмотрим, что мы можем сделать с нашим простым руководством по применению YARN.
Нам все еще нужно использовать эти аргументы контекста запуска, чтобы определить параметры нашей командной строки, чтобы в основном отобразить, как вещи передаются от клиента в мастер приложений в контейнер.
Что я добавил в 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 больше о том, как их использовать.
Вы могли бы затем изменить AppIT
модульный тест:
ApplicationInfo info = submitApplicationAndWait(Application.class, new String[]{"--my.client.arg1=arg1value"});
и запустить сборку с тестами
./gradlew clean build
или просто соберите его без запуска test:
./gradlew clean build -x test
а затем представить в настоящий кластер Hadoop с вашим my.client.arg1
,
java -jar build/libs/gs-yarn-basic-single-0.1.0.jar --my.client.arg1=arg1value
В любом случае вы видите 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 и т. Д.), Вам потребуется отдельный код / jar для порядка client / appmaster / container, чтобы создать собственный основной метод клиента. Все остальные руководства по началу работы с Spring YARN в основном используют многопроектные сборки, так что посмотрите на них. Например, если вы просто хотите иметь значение первого и второго аргумента без необходимости использования полного --my.client.arg1=arg1value
в командной строке.
Дайте нам знать, если это работает для вас, и если у вас есть другие идеи, чтобы сделать вещи проще.