|
@@ -108,6 +108,8 @@ class JobInProgress {
|
|
|
|
|
|
private LocalFileSystem localFs;
|
|
private LocalFileSystem localFs;
|
|
private String jobId;
|
|
private String jobId;
|
|
|
|
+ private boolean hasSpeculativeMaps;
|
|
|
|
+ private boolean hasSpeculativeReduces;
|
|
|
|
|
|
// Per-job counters
|
|
// Per-job counters
|
|
public static enum Counter {
|
|
public static enum Counter {
|
|
@@ -179,6 +181,8 @@ class JobInProgress {
|
|
this.jobMetrics.setTag("sessionId", conf.getSessionId());
|
|
this.jobMetrics.setTag("sessionId", conf.getSessionId());
|
|
this.jobMetrics.setTag("jobName", conf.getJobName());
|
|
this.jobMetrics.setTag("jobName", conf.getJobName());
|
|
this.jobMetrics.setTag("jobId", jobid);
|
|
this.jobMetrics.setTag("jobId", jobid);
|
|
|
|
+ hasSpeculativeMaps = conf.getMapSpeculativeExecution();
|
|
|
|
+ hasSpeculativeReduces = conf.getReduceSpeculativeExecution();
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -632,7 +636,7 @@ class JobInProgress {
|
|
|
|
|
|
|
|
|
|
int target = findNewTask(tts, clusterSize, status.mapProgress(),
|
|
int target = findNewTask(tts, clusterSize, status.mapProgress(),
|
|
- maps, nodesToMaps);
|
|
|
|
|
|
+ maps, nodesToMaps, hasSpeculativeMaps);
|
|
if (target == -1) {
|
|
if (target == -1) {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
@@ -668,7 +672,7 @@ class JobInProgress {
|
|
}
|
|
}
|
|
|
|
|
|
int target = findNewTask(tts, clusterSize, status.reduceProgress() ,
|
|
int target = findNewTask(tts, clusterSize, status.reduceProgress() ,
|
|
- reduces, null);
|
|
|
|
|
|
+ reduces, null, hasSpeculativeReduces);
|
|
if (target == -1) {
|
|
if (target == -1) {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
@@ -754,10 +758,11 @@ class JobInProgress {
|
|
return trackerErrors;
|
|
return trackerErrors;
|
|
}
|
|
}
|
|
|
|
|
|
- private boolean shouldRunSpeculativeTask(TaskInProgress task,
|
|
|
|
- double avgProgress,
|
|
|
|
- String taskTracker) {
|
|
|
|
- return task.hasSpeculativeTask(avgProgress) &&
|
|
|
|
|
|
+ private boolean shouldRunSpeculativeTask(long currentTime,
|
|
|
|
+ TaskInProgress task,
|
|
|
|
+ double avgProgress,
|
|
|
|
+ String taskTracker) {
|
|
|
|
+ return task.hasSpeculativeTask(currentTime, avgProgress) &&
|
|
!task.hasRunOnMachine(taskTracker);
|
|
!task.hasRunOnMachine(taskTracker);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -769,13 +774,15 @@ class JobInProgress {
|
|
* @param tasks The list of potential tasks to try
|
|
* @param tasks The list of potential tasks to try
|
|
* @param firstTaskToTry The first index in tasks to check
|
|
* @param firstTaskToTry The first index in tasks to check
|
|
* @param cachedTasks A list of tasks that would like to run on this node
|
|
* @param cachedTasks A list of tasks that would like to run on this node
|
|
|
|
+ * @param hasSpeculative Should it try to find speculative tasks
|
|
* @return the index in tasks of the selected task (or -1 for no task)
|
|
* @return the index in tasks of the selected task (or -1 for no task)
|
|
*/
|
|
*/
|
|
private int findNewTask(TaskTrackerStatus tts,
|
|
private int findNewTask(TaskTrackerStatus tts,
|
|
int clusterSize,
|
|
int clusterSize,
|
|
double avgProgress,
|
|
double avgProgress,
|
|
TaskInProgress[] tasks,
|
|
TaskInProgress[] tasks,
|
|
- Map<Node,List<TaskInProgress>> cachedTasks) {
|
|
|
|
|
|
+ Map<Node,List<TaskInProgress>> cachedTasks,
|
|
|
|
+ boolean hasSpeculative) {
|
|
String taskTracker = tts.getTrackerName();
|
|
String taskTracker = tts.getTrackerName();
|
|
int specTarget = -1;
|
|
int specTarget = -1;
|
|
|
|
|
|
@@ -799,6 +806,7 @@ class JobInProgress {
|
|
}
|
|
}
|
|
return -1;
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
+ long currentTime = System.currentTimeMillis();
|
|
|
|
|
|
//
|
|
//
|
|
// See if there is a split over a block that is stored on
|
|
// See if there is a split over a block that is stored on
|
|
@@ -845,8 +853,9 @@ class JobInProgress {
|
|
}
|
|
}
|
|
return cacheTarget;
|
|
return cacheTarget;
|
|
}
|
|
}
|
|
- if (specTarget == -1 &&
|
|
|
|
- shouldRunSpeculativeTask(tip, avgProgress, taskTracker)) {
|
|
|
|
|
|
+ if (hasSpeculative && specTarget == -1 &&
|
|
|
|
+ shouldRunSpeculativeTask(currentTime, tip, avgProgress,
|
|
|
|
+ taskTracker)) {
|
|
specTarget = tip.getIdWithinJob();
|
|
specTarget = tip.getIdWithinJob();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -881,8 +890,9 @@ class JobInProgress {
|
|
if (!isRunning) {
|
|
if (!isRunning) {
|
|
LOG.info("Choosing normal task " + tasks[i].getTIPId());
|
|
LOG.info("Choosing normal task " + tasks[i].getTIPId());
|
|
return i;
|
|
return i;
|
|
- } else if (specTarget == -1 &&
|
|
|
|
- shouldRunSpeculativeTask(task, avgProgress, taskTracker)) {
|
|
|
|
|
|
+ } else if (hasSpeculative && specTarget == -1 &&
|
|
|
|
+ shouldRunSpeculativeTask(currentTime, task, avgProgress,
|
|
|
|
+ taskTracker)) {
|
|
specTarget = i;
|
|
specTarget = i;
|
|
}
|
|
}
|
|
}
|
|
}
|