1、 新建 maven 工程
2、 编写代码,以 java Application 运行没有问题。
package Yarn.Yarn;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.nio.charset.Charset;
import java.text.DecimalFormat;
import java.util.EnumSet;
import java.util.List;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobID;
import org.apache.hadoop.mapred.TaskReport;
import org.apache.hadoop.mapred.JobStatus;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.ApplicationReport;
import org.apache.hadoop.yarn.api.records.YarnApplicationState;
import org.apache.hadoop.yarn.api.records.impl.pb.ApplicationReportPBImpl;
import org.apache.hadoop.yarn.client.api.YarnClient;
import org.apache.hadoop.yarn.client.cli.ApplicationCLI;
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.util.ConverterUtils;
public class YarnAppManager {
private YarnClient client;
protected PrintStream sysout = System.out;
private
static
final
String
APPLICATIONS_PATTERN
=
"%30s\t%20s\t%20s\t%10s\t%10s\t%18s\t%18s\t%15s\t%35s"
+ System.getProperty("line.separator");
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
YarnAppManager app = new YarnAppManager();
app.testAppState();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void getJobState(){
Configuration conf = new Configuration();
client = YarnClient.createYarnClient();
client.init(conf);
client.start();
}
private void testAppState() throws YarnException, IOException, InterruptedException,
ClassNotFoundException {
Configuration conf = new Configuration();
client = YarnClient.createYarnClient();
client.init(conf);
client.start();
EnumSet
EnumSet.noneOf(YarnApplicationState.class);
if (appStates.isEmpty()) {
appStates
=
appStates.add(YarnApplicationState.RUNNING);
appStates.add(YarnApplicationState.ACCEPTED);
appStates.add(YarnApplicationState.SUBMITTED);
}
List appsReport = client.getApplications(appStates);
PrintWriter writer
=
new PrintWriter(new OutputStreamWriter(sysout,
Charset.forName("UTF-8")));
for (ApplicationReport appReport : appsReport) {
ApplicationReportPBImpl app = (ApplicationReportPBImpl) appReport;
DecimalFormat formatter = new DecimalFormat("###.##%");
String progress = formatter.format(appReport.getProgress());
writer.printf(APPLICATIONS_PATTERN,
appReport.getApplicationId(),
appReport.getName(),
appReport.getQueue(),
appReport.getApplicationType(),
appReport.getUser(),
appReport.getFinalApplicationStatus(), progress,
appReport.getYarnApplicationState(),
appReport.getOriginalTrackingUrl());
}
writer.flush();
for (ApplicationReport appReport : appsReport) {
String type = appReport.getApplicationType();
if(type.equalsIgnoreCase("spark")){
continue;
}
getStatusByAppId(appReport);
}
}
private void getStatusByAppId(ApplicationReport app){
String user = app.getUser();
ApplicationId id = app.getApplicationId();
String appId = app.getApplicationId().toString();
System.out.println(appId);
}
private void killApplication(String applicationId) throws YarnException, IOException{
ApplicationId appId = ConverterUtils.toApplicationId(applicationId);
ApplicationReport
try {
appReport = null;
appReport = client.getApplicationReport(appId);
} catch (ApplicationNotFoundException e) {
sysout.println("Application with id '" + applicationId +
"' doesn't exist in RM.");
throw e;
}
if (appReport.getYarnApplicationState() == YarnApplicationState.FINISHED
|| appReport.getYarnApplicationState() == YarnApplicationState.KILLED
|| appReport.getYarnApplicationState() == YarnApplicationState.FAILED) {
sysout.println("Application " + applicationId + " has already finished ");
} else {
sysout.println("Killing application " + applicationId);
client.killApplication(appId);
}
}
private void getAppState() throws Exception {
String[] args = { "-list" };
ApplicationCLI.main(args);
}
}
3、 使用 maven 打包 jar 包,在 linux 下的 yarn jar 中运行,因此不需要将引用 jar 包打包到
jar 包中。
4.0.0
YarnManager
Yarn
0.0.1-SNAPSHOT
jar
Yarn
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
org.apache.hadoop
hadoop-mapreduce-client-core
2.3.0
org.apache.hadoop
hadoop-mapreduce-client-jobclient
2.3.0
org.apache.hadoop
hadoop-hdfs
2.3.0
org.apache.hadoop
hadoop-common
2.3.0
jdk.tools
jdk.tools
1.6
system
C:/Program
Files/Java/jdk1.8.0_73/lib/tools.jar
org.apache.hadoop
hadoop-yarn-common
2.3.0
org.apache.hadoop
hadoop-yarn-client
2.3.0
org.apache.hadoop
hadoop-yarn-server-resourcemanager
2.3.0
org.apache.maven.plugins
maven-jar-plugin
YarnManager.Yarn.YarnAppManager
需要制定 main 函数的类,为新建 Maven 工程时的类名。新建 maven 工程时的名称为:
YarnManager.Yarn.YarnAppManager。
4、 使用 maven package 打包过程中会提示,编译器使用的是 JRE 而不是 JDK,修改 eclipse
的编译器,修改 Window—>Preferences—>Java-->Install JREs-->Add,添加本机的 JDK。打
包能够正常完成。
5、 运行 eclipse 中,以 java application 运行 main 函数,会出现停滞状态,无法继续运行。
可以运行,但是会慢,jdk 没有 jre 运行快。
6、工程右键 Build Path-->Configure Build Path-->edit-->Install JREs 选
择 jdk,点击 ok。即可出现执行结果。
7、查询 Job 信息
//
JobClient jobClient = new JobClient(new JobConf(conf));
JobStatus[] jobs = jobClient.getAllJobs();
JobStatus[] jobs = jobClient.jobsToComplete();
for(JobStatus job : jobs){
JobID id = job.getJobID();
TaskReport[] maps = jobClient.getMapTaskReports(id);
System.out.println(maps.length);
TaskReport[] reduces = jobClient.getReduceTaskReports(id);
System.out.println(reduces.length);
}
8、 上传至 linux 环境运行 jar 包
Yarn jar Yarn.jar