我正在将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'
代码中是否有不正确的地方?
答案 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
}
}