1

我正在使用带有 Cloudera 的 Hadoop 2.0 并尝试使用 Java 程序来检查特定的 Spark applicationID 是否正在运行并采取进一步的步骤。

我有触发特定 Spark 应用程序的主类和用户(帐户)信息。

我知道以下内容,但是否有任何 Java API 可以帮助使用 Main 类名和用户名进行解析和匹配?

yarn application -list

有什么方法可以通过在另一个 Java 程序中使用 Main Class 和用户信息来获取正在运行的 spark 应用程序的 applicationID 吗?

[编辑] 一种方法是发出以下命令:

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

如果有任何可以简化的Java API,请分享。

[编辑] 上面的命令很好,但是我尝试使用 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'

代码中有什么不正确的吗?

4

2 回答 2

1

您可以在当前 spark 应用程序代码本身中获取应用程序 ID。

这是示例(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();

请试试这个。

于 2019-03-18T11:39:32.270 回答
1

Vijay 建议的上述方法适用于当前正在运行的应用程序。

但似乎您的要求是获得所有应用程序。


问题:是否有任何 Java API 可以帮助使用 Main 类名和用户名进行解析和匹配?

请参阅 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
        }
    }
于 2019-03-18T15:49:40.117 回答