如何使用主类和用户获取Spark ApplicationID

时间:2019-03-18 10:19:23

标签: java apache-spark

我正在将Hadoop 2.0与Cloudera一起使用,并尝试一个Java程序,该程序将检查特定的Spark applicationID是否正在运行,并采取进一步的步骤。

我有Main Class和用户(帐户)信息,这些信息触发了特定的Spark应用程序。

我在下面知道,但是有没有Java API可以使用Main类名和用户名来帮助解析和匹配?

yarn application -list

是否可以通过在另一个Java程序中使用Main Class和用户信息来获取正在运行的Spark Application的applicationID?

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

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 个答案:

答案 0 :(得分: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();

请尝试这个。

答案 1 :(得分:1)

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

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


  

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

请参阅hadoop文档YarnClient ...here

基本上,YarnClient具有getApplications,它将获取所有应用程序。

  

抽象   列出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
        }
    }