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 в командной строке.

Дайте нам знать, если это работает для вас, и если у вас есть другие идеи, чтобы сделать вещи проще.

Другие вопросы по тегам