Как получить Spark ApplicationID, используя Main Class и пользователя - PullRequest
1 голос
/ 18 марта 2019

Я использую Hadoop 2.0 с Cloudera и пробую программу на Java, которая проверит, работает ли конкретный идентификатор приложения Spark или нет, и предпримет дальнейшие шаги.

У меня есть информация о главном классе и пользователе (учетной записи), которая сработалаконкретное приложение Spark.

Мне известно об этом ниже, но есть ли какой-нибудь Java API, который может помочь разобрать и сопоставить, используя имя основного класса и имя пользователя?

yarn application -list

Есть ли способ получить идентификатор приложения изРаботающее приложение Spark с использованием Main Class и пользовательской информации в другой Java-программе?

[EDIT] Один из способов - выполнить следующую команду:

yarn application -list -appStates RUNNING | grep $application_name | grep $user | cut -f 1

Если есть какой-либо Java API, которыйМожно упростить, пожалуйста, поделитесь.

[EDIT] Выше команда в порядке, однако я попытался с YarnClient, как показано ниже:

открытый класс SomeCheck {

    public boolean run(String account, String appName) throws YarnException, IOException {




        SparkContext sc = new SparkContext(new SparkConf().setMaster("yarn").setAppName("SomeCheck"));
        YarnConfiguration conf = new YarnConfiguration(SparkHadoopUtil.get().newConfiguration(sc.getConf()));

        YarnClient yarnClient = YarnClient.createYarnClient();
        yarnClient.init(conf);
        yarnClient.start();
        EnumSet<YarnApplicationState> states =
                  EnumSet.of(YarnApplicationState.ACCEPTED, YarnApplicationState.RUNNING);

        List<ApplicationReport> applications = yarnClient.getApplications(states);


        for (ApplicationReport application : applications) {
               if ((application.getUser() == account) & (application.getName() == appName)) return true;
        }

        return false;

    }

}

Сбой суказывая на SparkContext sc = new SparkContext(new SparkConf().setMaster("yarn").setAppName("SomeCheck"));

Ошибка:

 ERROR spark.SparkContext: Error initializing SparkContext.
com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.version'

Есть ли что-то неправильное в коде?

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вышеупомянутый подход, предложенный Виджаем, будет работать для запущенного в данный момент приложения.

Но, похоже, вам необходимо получить все приложения.


Вопрос: есть ликакой-нибудь Java API, который может помочь разобрать и сопоставить, используя имя главного класса и имя пользователя?

См. документацию hadoop YarnClient ... здесь

В основном, YarnClient имеет getApplications, который получит все приложения.

abstract List getApplications (EnumSet applicationStates) Получить отчет (ApplicationReport) о приложениях, соответствующих заданным состояниям приложений в кластере.

Вы можете попробовать что-то вроде этого, что будет периодически печатать все приложения

import org.apache.hadoop.yarn.client.api.YarnClient
public class YarnMonitor {
    public static void main(String [] args) throws Exception{
        SparkContext sc = new SparkContext(new SparkConf().setMaster("yarn").setAppName("Yarn Monitor"));

        YarnClient yarnClient = YarnClient.createYarnClient();
        YarnConfiguration yarnConf = new YarnConfiguration(SparkHadoopUtil.get().newConfiguration(sc.getConf()));

        while(true){ // periodically loop and get currently running apps

            yarnClient = YarnClient.createYarnClient();
            List<ApplicationReport> applications = yarnClient.getApplications();

            for (ApplicationReport application : applications) {
                System.out.println(application.getName());
            }
            Thread.sleep(1000); // sleep for 1000 ms
        }
    }
1 голос
/ 18 марта 2019

Вы можете получить идентификатор приложения в самом коде текущего приложения Spark.

вот пример (Scala), фрагмент кода Java также имеет тот же API.

// create spark configuration
SparkConf conf = new SparkConf().setMaster("local");
conf.set("spark.app.name", "test");

// create a spark context
SparkContext sc = new SparkContext(conf);

// get the application id
String appId = sc.applicationId();

// print the application id
System.out.println("Application id:  " + appId);

// stop the spark context
sc.stop();

Пожалуйста, попробуйте это.

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