/*!
* AtlantBH Custom Jmeter Components v1.0.0
* http://www.atlantbh.com/jmeter-components/
*
* Copyright 2011, AtlantBH
*
* Licensed under the under the Apache License, Version 2.0.
*/
package com.atlantbh.jmeter.plugins.hadooputilities.jobstatistics;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.mapred.Counters.Group;
import org.apache.hadoop.mapred.JobClient;
import org.apache.hadoop.mapred.JobConf;
import org.apache.hadoop.mapred.JobID;
import org.apache.hadoop.mapred.RunningJob;
import org.apache.hadoop.mapred.Counters;
import org.apache.hadoop.mapred.Counters.Counter;
/**
* This class exposes functionalities on Job layer. Those functionalities are:
* 1. getJobCountersByJobId 2. getJobCountersByJobIdAndGroupName 3.
* getJobStatisticsByJobId
*/
public class JobLayer {
private static final long serialVersionUID = 1L;
private String jobId = "";
private String jobTracker = "";
private String jobState = "";
private String groupName = "";
public JobLayer() {
}
public String getJobId() {
return jobId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getJobTracker() {
return jobTracker;
}
public void setJobTracker(String jobTracker) {
this.jobTracker = jobTracker;
}
public String getJobState() {
return jobState;
}
public void setJobState(String jobState) {
this.jobState = jobState;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String groupName) {
this.groupName = groupName;
}
protected JobClient prepareJobClient(String jobTracker) throws IOException {
Configuration conf = new Configuration();
conf.set("mapred.job.tracker", jobTracker);
JobConf jobConf = new JobConf(conf);
JobClient client = new JobClient(jobConf);
return client;
}
protected JobID convertToJobId(String jobId) {
String id = jobId.replace("job_", "");
return new JobID(id.split("_")[0], Integer.valueOf(id.split("_")[1]));
}
public String getCountersAsXml(Map<String, String> jobCounters) throws IOException {
StringBuilder stBuilder = new StringBuilder();
stBuilder.append("<counters>\n");
for (Map.Entry<String, String> entry : jobCounters.entrySet()) {
stBuilder.append(" <counter name=\"").append(entry.getKey()).append("\" value=\"").append(entry.getValue()).append("\"/>\n");
}
stBuilder.append("</counters>\n");
return stBuilder.toString();
}
private Map<String, String> getJobCounters(String jobTracker, String jobId) throws IOException {
JobClient client = prepareJobClient(jobTracker);
JobID id = this.convertToJobId(jobId);
Map<String, String> counters = new HashMap<String, String>();
RunningJob job = client.getJob(id);
Counters counter = job.getCounters();
Iterator<Group> iter = counter.iterator();
if (!getGroupName().equalsIgnoreCase("")) {
while (iter.hasNext()) {
Group group = iter.next();
if (group.getDisplayName().equalsIgnoreCase(getGroupName())) {
Iterator<Counter> cIter = group.iterator();
while (cIter.hasNext()) {
Counter c = cIter.next();
counters.put(c.getDisplayName(), String.valueOf(c.getValue()));
}
}
}
} else {
while (iter.hasNext()) {
Group group = iter.next();
Iterator<Counter> cIter = group.iterator();
while (cIter.hasNext()) {
Counter c = cIter.next();
counters.put(c.getDisplayName(), String.valueOf(c.getValue()));
}
}
}
return counters;
}
public Map<String, String> getJobCountersByJobId(String jobTracker, String jobId) throws IOException {
return getJobCounters(jobTracker, jobId);
}
public Map<String, String> getJobCountersByJobIdAndGroupName(String jobTracker, String jobId, String groupName) throws IOException {
setGroupName(groupName);
return getJobCounters(jobTracker, jobId);
}
public String getJobStatisticsByJobId(String jobTracker, String jobId) throws IOException {
StringBuilder jobStatistics = new StringBuilder();
JobClient client = prepareJobClient(jobTracker);
JobID id = convertToJobId(jobId);
RunningJob job = client.getJob(id);
double mapProgress = job.mapProgress() * 100;
double reduceProgress = job.reduceProgress() * 100;
String mapPercentage = Double.toString(mapProgress) + "%";
String reducePercentage = Double.toString(reduceProgress) + "%";
jobStatistics.append("<job id='").append(jobId).append("'" + " name='").append(job.getJobName()).append("'>\n");
jobStatistics.append(" <mapProgress>").append(mapPercentage).append("</mapProgress>\n");
jobStatistics.append(" <reduceProgress>").append(reducePercentage).append("</reduceProgress>\n");
jobStatistics.append(" <complete>").append(job.isComplete()).append("</complete>\n");
jobStatistics.append(" <successful>").append(job.isSuccessful()).append("</successful>\n");
jobStatistics.append(" <url>").append(job.getTrackingURL()).append("</url>\n");
jobStatistics.append("</job>");
return jobStatistics.toString();
}
}