package com.dgrid.handlers;
import java.util.LinkedList;
import java.util.List;
import com.dgrid.api.BaseJobletTypeHandler;
import com.dgrid.api.JobletTypeHandler;
import com.dgrid.api.MapReduceJob;
import com.dgrid.api.SimpleJobletResult;
import com.dgrid.gen.Constants;
import com.dgrid.gen.JOB_CALLBACK_TYPES;
import com.dgrid.gen.JOB_STATUS;
import com.dgrid.gen.Job;
import com.dgrid.gen.Joblet;
import com.dgrid.gen.JobletResult;
import com.dgrid.service.DGridClient;
public class JavaMapReduceTypeHandler extends BaseJobletTypeHandler implements
JobletTypeHandler {
public static final String CLASS_NAME_PARAM = "class";
public JavaMapReduceTypeHandler() {
}
public JobletResult execute(Joblet joblet, DGridClient gridClient)
throws Throwable {
log.trace("execute()");
Class cls = Class.forName(joblet.getParameters().get(CLASS_NAME_PARAM));
Object impl = cls.newInstance();
MapReduceJob mrj = (MapReduceJob) impl;
JobletResult jr = execute(mrj, joblet, gridClient);
return jr;
}
protected JobletResult execute(MapReduceJob mrj, Joblet joblet,
DGridClient gridClient) throws Throwable {
long start = System.currentTimeMillis();
JobletResult result = null;
if (joblet.getJobletType().equals(Constants.JAVA_MR_JOB)) {
result = map(mrj, joblet, gridClient);
Joblet reducer = new Joblet(0, 0l, joblet.getJobId(), 0, joblet
.getSubmitter(), joblet.getPriority(),
Constants.JAVA_MR_REDUCER, "", joblet.getParameters(),
joblet.getContent(), JOB_STATUS.SAVED);
gridClient.submitJoblet(reducer, joblet.getJobId());
} else if (joblet.getJobletType().equals(Constants.JAVA_MR_REDUCER))
result = reduce(Constants.JAVA_MR_JOB, mrj, joblet, gridClient);
else
throw new UnsupportedOperationException(String.format(
"Unknown joblet type (%1$s)", joblet.getJobletType()));
return result;
}
protected JobletResult map(MapReduceJob mrj, Joblet joblet,
DGridClient gridClient) throws Throwable {
long start = System.currentTimeMillis();
submitMappers(mrj, joblet, gridClient);
JobletResult result = new JobletResult(0, 0l, 0, (System
.currentTimeMillis() - start), JOB_STATUS.COMPLETED, "", joblet);
return result;
}
protected JobletResult reduce(String mapperType, MapReduceJob mrj,
Joblet joblet, DGridClient gridClient) throws Throwable {
long start = System.currentTimeMillis();
SimpleJobletResult sjr = executeReducer(mapperType, mrj, joblet,
gridClient);
JobletResult result = new JobletResult(0, 0l, sjr.getReturnCode(),
(System.currentTimeMillis() - start), sjr.getStatus(), sjr
.getDetails(), joblet);
return result;
}
protected SimpleJobletResult executeReducer(String mapType,
MapReduceJob mrj, Joblet joblet, DGridClient gridClient)
throws Throwable {
// List<JobletResult> results = gridClient.getResults(joblet.jobId);
List<JobletResult> results = new LinkedList<JobletResult>();
Job job = gridClient.getJob(joblet.getJobId());
for (Joblet j : job.getJoblets()) {
if ((!j.getJobletType().equals(mapType))
&& (j.getStatus() == JOB_STATUS.COMPLETED)) {
JobletResult jr = gridClient.getJobletResult(j.getId());
results.add(jr);
}
}
SimpleJobletResult result = mrj.reduce(results, joblet.getParameters(),
gridClient);
return result;
}
private void submitMappers(MapReduceJob mrj, Joblet joblet,
DGridClient gridClient) throws Throwable {
List<Joblet> joblets = mrj.getMappers(joblet, gridClient);
for (Joblet j : joblets) {
gridClient.submitJoblet(j, joblet.getJobId(),
JOB_CALLBACK_TYPES.NONE, "", null);
}
}
}