package com.dgrid.test.mr; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import com.dgrid.api.MapReduceJob; import com.dgrid.api.SimpleJobletResult; import com.dgrid.gen.Constants; import com.dgrid.gen.JOB_STATUS; import com.dgrid.gen.Joblet; import com.dgrid.gen.JobletResult; import com.dgrid.service.DGridClient; public class SimpleMapReduceJob implements MapReduceJob { public List<Joblet> getMappers(Joblet joblet, DGridClient gridClient) { String mapper = "grid = Packages.com.dgrid.api;\n" + "thrift = Packages.com.dgrid.gen;\n" + "function execute(joblet, gridClient) {\n" + " var ints_array = joblet.parameters.get('ints').split(',');\n" + " var z = 0;\n" + " for (key in ints_array) {\n" + " z += parseInt(ints_array[key]);\n" + " }\n" + " return grid.SimpleJobletResult(0, thrift.JOB_STATUS.COMPLETED,\n" + " z);\n" + "}"; List<Joblet> joblets = new LinkedList<Joblet>(); // get an array of ints from joblet parameter String intArrayString = joblet.getContent(); int[] ints = parseIntArray(intArrayString); int[][] splitInts = partition(ints); for (int i = 0; i < splitInts.length; ++i) { Map<String, String> params = new HashMap<String, String>(); params.put("ints", joinIntArray(splitInts[i])); Joblet j = new Joblet(0, 0l, joblet.getJobId(), 0, joblet .getSubmitter(), joblet.getPriority(), Constants.JAVASCRIPT_JOBLET, "", params, mapper, JOB_STATUS.RECEIVED); joblets.add(j); } return joblets; } public SimpleJobletResult reduce(List<JobletResult> results, Map<String, String> parameters, DGridClient gridClient) { int retval = 0; for (JobletResult jr : results) { int v = Integer.parseInt(jr.getDetails()); retval += v; } return new SimpleJobletResult(0, JOB_STATUS.COMPLETED, Integer .toString(retval)); } private int[] parseIntArray(String intArrayString) { String[] strings = intArrayString.split(","); int[] ints = new int[strings.length]; for (int i = 0; i < ints.length; ++i) { ints[i] = Integer.parseInt(strings[i]); } return ints; } private int[][] partition(int[] ints) { int size = ints.length / 4; int[][] retval = new int[size][4]; int pos = 0; for (int i = 0; i < size; ++i) { for (int j = 0; j < 4; ++j) { retval[i][j] = ints[pos]; ++pos; } } return retval; } private String joinIntArray(int[] array) { StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; ++i) { sb.append(array[i]); sb.append(','); } return sb.toString(); } }