YARN-9293. Optimize MockAMLauncher event handling. Contributed by Bibin A Chundatt.
This commit is contained in:
parent
0d7a5ac5f5
commit
134ae8fc80
@ -60,6 +60,7 @@
|
|||||||
import org.apache.hadoop.util.ReflectionUtils;
|
import org.apache.hadoop.util.ReflectionUtils;
|
||||||
import org.apache.hadoop.util.Tool;
|
import org.apache.hadoop.util.Tool;
|
||||||
import org.apache.hadoop.util.ToolRunner;
|
import org.apache.hadoop.util.ToolRunner;
|
||||||
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
||||||
import org.apache.hadoop.yarn.api.records.ExecutionType;
|
import org.apache.hadoop.yarn.api.records.ExecutionType;
|
||||||
import org.apache.hadoop.yarn.api.records.NodeId;
|
import org.apache.hadoop.yarn.api.records.NodeId;
|
||||||
import org.apache.hadoop.yarn.api.records.NodeLabel;
|
import org.apache.hadoop.yarn.api.records.NodeLabel;
|
||||||
@ -113,6 +114,7 @@ public class SLSRunner extends Configured implements Tool {
|
|||||||
// AM simulator
|
// AM simulator
|
||||||
private int AM_ID;
|
private int AM_ID;
|
||||||
private Map<String, AMSimulator> amMap;
|
private Map<String, AMSimulator> amMap;
|
||||||
|
private Map<ApplicationId, AMSimulator> appIdAMSim;
|
||||||
private Set<String> trackedApps;
|
private Set<String> trackedApps;
|
||||||
private Map<String, Class> amClassMap;
|
private Map<String, Class> amClassMap;
|
||||||
private static int remainingApps = 0;
|
private static int remainingApps = 0;
|
||||||
@ -170,7 +172,7 @@ private void init(Configuration tempConf) throws ClassNotFoundException {
|
|||||||
queueAppNumMap = new HashMap<>();
|
queueAppNumMap = new HashMap<>();
|
||||||
amMap = new ConcurrentHashMap<>();
|
amMap = new ConcurrentHashMap<>();
|
||||||
amClassMap = new HashMap<>();
|
amClassMap = new HashMap<>();
|
||||||
|
appIdAMSim = new ConcurrentHashMap<>();
|
||||||
// runner configuration
|
// runner configuration
|
||||||
setConf(tempConf);
|
setConf(tempConf);
|
||||||
|
|
||||||
@ -277,7 +279,7 @@ private void startRM() throws ClassNotFoundException, YarnException {
|
|||||||
rm = new ResourceManager() {
|
rm = new ResourceManager() {
|
||||||
@Override
|
@Override
|
||||||
protected ApplicationMasterLauncher createAMLauncher() {
|
protected ApplicationMasterLauncher createAMLauncher() {
|
||||||
return new MockAMLauncher(se, this.rmContext, amMap);
|
return new MockAMLauncher(se, this.rmContext, appIdAMSim);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -587,7 +589,7 @@ private void startAMFromRumenTrace(String inputTrace, long baselineTimeMS)
|
|||||||
try {
|
try {
|
||||||
createAMForJob(job, baselineTimeMS);
|
createAMForJob(job, baselineTimeMS);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOG.error("Failed to create an AM: {}", e.getMessage());
|
LOG.error("Failed to create an AM", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
job = reader.getNext();
|
job = reader.getNext();
|
||||||
@ -808,7 +810,8 @@ private void runNewAM(String jobType, String user,
|
|||||||
AM_ID++;
|
AM_ID++;
|
||||||
amSim.init(heartbeatInterval, containerList, rm, this, jobStartTimeMS,
|
amSim.init(heartbeatInterval, containerList, rm, this, jobStartTimeMS,
|
||||||
jobFinishTimeMS, user, jobQueue, isTracked, oldJobId,
|
jobFinishTimeMS, user, jobQueue, isTracked, oldJobId,
|
||||||
runner.getStartTimeMS(), amContainerResource, labelExpr, params);
|
runner.getStartTimeMS(), amContainerResource, labelExpr, params,
|
||||||
|
appIdAMSim);
|
||||||
if(reservationId != null) {
|
if(reservationId != null) {
|
||||||
// if we have a ReservationId, delegate reservation creation to
|
// if we have a ReservationId, delegate reservation creation to
|
||||||
// AMSim (reservation shape is impl specific)
|
// AMSim (reservation shape is impl specific)
|
||||||
|
@ -116,6 +116,8 @@ public abstract class AMSimulator extends TaskRunner.Task {
|
|||||||
|
|
||||||
private ReservationSubmissionRequest reservationRequest;
|
private ReservationSubmissionRequest reservationRequest;
|
||||||
|
|
||||||
|
private Map<ApplicationId, AMSimulator> appIdToAMSim;
|
||||||
|
|
||||||
public AMSimulator() {
|
public AMSimulator() {
|
||||||
this.responseQueue = new LinkedBlockingQueue<>();
|
this.responseQueue = new LinkedBlockingQueue<>();
|
||||||
}
|
}
|
||||||
@ -125,8 +127,8 @@ public void init(int heartbeatInterval,
|
|||||||
List<ContainerSimulator> containerList, ResourceManager resourceManager,
|
List<ContainerSimulator> containerList, ResourceManager resourceManager,
|
||||||
SLSRunner slsRunnner, long startTime, long finishTime, String simUser,
|
SLSRunner slsRunnner, long startTime, long finishTime, String simUser,
|
||||||
String simQueue, boolean tracked, String oldApp, long baseTimeMS,
|
String simQueue, boolean tracked, String oldApp, long baseTimeMS,
|
||||||
Resource amResource, String nodeLabelExpr,
|
Resource amResource, String nodeLabelExpr, Map<String, String> params,
|
||||||
Map<String, String> params) {
|
Map<ApplicationId, AMSimulator> appIdAMSim) {
|
||||||
super.init(startTime, startTime + 1000000L * heartbeatInterval,
|
super.init(startTime, startTime + 1000000L * heartbeatInterval,
|
||||||
heartbeatInterval);
|
heartbeatInterval);
|
||||||
this.user = simUser;
|
this.user = simUser;
|
||||||
@ -140,6 +142,7 @@ public void init(int heartbeatInterval,
|
|||||||
this.traceFinishTimeMS = finishTime;
|
this.traceFinishTimeMS = finishTime;
|
||||||
this.amContainerResource = amResource;
|
this.amContainerResource = amResource;
|
||||||
this.nodeLabelExpression = nodeLabelExpr;
|
this.nodeLabelExpression = nodeLabelExpr;
|
||||||
|
this.appIdToAMSim = appIdAMSim;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -163,6 +166,9 @@ public void firstStep() throws Exception {
|
|||||||
// submit application, waiting until ACCEPTED
|
// submit application, waiting until ACCEPTED
|
||||||
submitApp(reservationId);
|
submitApp(reservationId);
|
||||||
|
|
||||||
|
// add submitted app to mapping
|
||||||
|
appIdToAMSim.put(appId, this);
|
||||||
|
|
||||||
// track app metrics
|
// track app metrics
|
||||||
trackApp();
|
trackApp();
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
|
import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
|
||||||
import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse;
|
import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse;
|
||||||
import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
|
import org.apache.hadoop.yarn.api.protocolrecords.ReservationSubmissionRequest;
|
||||||
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
||||||
import org.apache.hadoop.yarn.api.records.Container;
|
import org.apache.hadoop.yarn.api.records.Container;
|
||||||
import org.apache.hadoop.yarn.api.records.ReservationId;
|
import org.apache.hadoop.yarn.api.records.ReservationId;
|
||||||
import org.apache.hadoop.yarn.api.records.Resource;
|
import org.apache.hadoop.yarn.api.records.Resource;
|
||||||
@ -127,10 +128,10 @@ public void init(int heartbeatInterval,
|
|||||||
long traceStartTime, long traceFinishTime, String user, String queue,
|
long traceStartTime, long traceFinishTime, String user, String queue,
|
||||||
boolean isTracked, String oldAppId, long baselineStartTimeMS,
|
boolean isTracked, String oldAppId, long baselineStartTimeMS,
|
||||||
Resource amContainerResource, String nodeLabelExpr,
|
Resource amContainerResource, String nodeLabelExpr,
|
||||||
Map<String, String> params) {
|
Map<String, String> params, Map<ApplicationId, AMSimulator> appIdAMSim) {
|
||||||
super.init(heartbeatInterval, containerList, rm, se,
|
super.init(heartbeatInterval, containerList, rm, se, traceStartTime,
|
||||||
traceStartTime, traceFinishTime, user, queue, isTracked, oldAppId,
|
traceFinishTime, user, queue, isTracked, oldAppId, baselineStartTimeMS,
|
||||||
baselineStartTimeMS, amContainerResource, nodeLabelExpr, params);
|
amContainerResource, nodeLabelExpr, params, appIdAMSim);
|
||||||
amtype = "mapreduce";
|
amtype = "mapreduce";
|
||||||
|
|
||||||
// get map/reduce tasks
|
// get map/reduce tasks
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
import org.apache.hadoop.security.token.Token;
|
import org.apache.hadoop.security.token.Token;
|
||||||
import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
|
import org.apache.hadoop.yarn.api.protocolrecords.AllocateRequest;
|
||||||
import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse;
|
import org.apache.hadoop.yarn.api.protocolrecords.AllocateResponse;
|
||||||
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
||||||
import org.apache.hadoop.yarn.api.records.Container;
|
import org.apache.hadoop.yarn.api.records.Container;
|
||||||
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
|
import org.apache.hadoop.yarn.api.records.ContainerExitStatus;
|
||||||
import org.apache.hadoop.yarn.api.records.ContainerId;
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
||||||
@ -97,10 +98,10 @@ public void init(int heartbeatInterval,
|
|||||||
long traceStartTime, long traceFinishTime, String user, String queue,
|
long traceStartTime, long traceFinishTime, String user, String queue,
|
||||||
boolean isTracked, String oldAppId, long baselineStartTimeMS,
|
boolean isTracked, String oldAppId, long baselineStartTimeMS,
|
||||||
Resource amContainerResource, String nodeLabelExpr,
|
Resource amContainerResource, String nodeLabelExpr,
|
||||||
Map<String, String> params) {
|
Map<String, String> params, Map<ApplicationId, AMSimulator> appIdAMSim) {
|
||||||
super.init(heartbeatInterval, containerList, rm, se, traceStartTime,
|
super.init(heartbeatInterval, containerList, rm, se, traceStartTime,
|
||||||
traceFinishTime, user, queue, isTracked, oldAppId, baselineStartTimeMS,
|
traceFinishTime, user, queue, isTracked, oldAppId, baselineStartTimeMS,
|
||||||
amContainerResource, nodeLabelExpr, params);
|
amContainerResource, nodeLabelExpr, params, appIdAMSim);
|
||||||
amtype = "stream";
|
amtype = "stream";
|
||||||
|
|
||||||
allStreams.addAll(containerList);
|
allStreams.addAll(containerList);
|
||||||
|
@ -45,13 +45,14 @@ public class MockAMLauncher extends ApplicationMasterLauncher
|
|||||||
private static final Logger LOG = LoggerFactory.getLogger(
|
private static final Logger LOG = LoggerFactory.getLogger(
|
||||||
MockAMLauncher.class);
|
MockAMLauncher.class);
|
||||||
|
|
||||||
Map<String, AMSimulator> amMap;
|
private Map<ApplicationId, AMSimulator> appIdAMSim;
|
||||||
|
|
||||||
SLSRunner se;
|
SLSRunner se;
|
||||||
|
|
||||||
public MockAMLauncher(SLSRunner se, RMContext rmContext,
|
public MockAMLauncher(SLSRunner se, RMContext rmContext,
|
||||||
Map<String, AMSimulator> amMap) {
|
Map<ApplicationId, AMSimulator> appIdAMSim) {
|
||||||
super(rmContext);
|
super(rmContext);
|
||||||
this.amMap = amMap;
|
this.appIdAMSim = appIdAMSim;
|
||||||
this.se = se;
|
this.se = se;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,30 +87,28 @@ public void handle(AMLauncherEvent event) {
|
|||||||
event.getAppAttempt().getAppAttemptId().getApplicationId();
|
event.getAppAttempt().getAppAttemptId().getApplicationId();
|
||||||
|
|
||||||
// find AMSimulator
|
// find AMSimulator
|
||||||
for (AMSimulator ams : amMap.values()) {
|
AMSimulator ams = appIdAMSim.get(appId);
|
||||||
if (ams.getApplicationId() != null && ams.getApplicationId().equals(
|
if (ams != null) {
|
||||||
appId)) {
|
try {
|
||||||
try {
|
Container amContainer = event.getAppAttempt().getMasterContainer();
|
||||||
Container amContainer = event.getAppAttempt().getMasterContainer();
|
|
||||||
|
|
||||||
setupAMRMToken(event.getAppAttempt());
|
setupAMRMToken(event.getAppAttempt());
|
||||||
|
|
||||||
// Notify RMAppAttempt to change state
|
// Notify RMAppAttempt to change state
|
||||||
super.context.getDispatcher().getEventHandler().handle(
|
super.context.getDispatcher().getEventHandler().handle(
|
||||||
new RMAppAttemptEvent(event.getAppAttempt().getAppAttemptId(),
|
new RMAppAttemptEvent(event.getAppAttempt().getAppAttemptId(),
|
||||||
RMAppAttemptEventType.LAUNCHED));
|
RMAppAttemptEventType.LAUNCHED));
|
||||||
|
|
||||||
ams.notifyAMContainerLaunched(
|
ams.notifyAMContainerLaunched(
|
||||||
event.getAppAttempt().getMasterContainer());
|
event.getAppAttempt().getMasterContainer());
|
||||||
LOG.info("Notify AM launcher launched:" + amContainer.getId());
|
LOG.info("Notify AM launcher launched:" + amContainer.getId());
|
||||||
|
|
||||||
se.getNmMap().get(amContainer.getNodeId())
|
se.getNmMap().get(amContainer.getNodeId())
|
||||||
.addNewContainer(amContainer, 100000000L);
|
.addNewContainer(amContainer, 100000000L);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new YarnRuntimeException(e);
|
throw new YarnRuntimeException(e);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,4 +116,5 @@ public void handle(AMLauncherEvent event) {
|
|||||||
"Didn't find any AMSimulator for applicationId=" + appId);
|
"Didn't find any AMSimulator for applicationId=" + appId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
package org.apache.hadoop.yarn.sls.appmaster;
|
package org.apache.hadoop.yarn.sls.appmaster;
|
||||||
|
|
||||||
import com.codahale.metrics.MetricRegistry;
|
import com.codahale.metrics.MetricRegistry;
|
||||||
|
import java.util.HashMap;
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
import org.apache.hadoop.yarn.api.records.ApplicationId;
|
||||||
import org.apache.hadoop.yarn.api.records.ReservationId;
|
import org.apache.hadoop.yarn.api.records.ReservationId;
|
||||||
@ -144,8 +145,10 @@ public void testAMSimulator() throws Exception {
|
|||||||
String appId = "app1";
|
String appId = "app1";
|
||||||
String queue = "default";
|
String queue = "default";
|
||||||
List<ContainerSimulator> containers = new ArrayList<>();
|
List<ContainerSimulator> containers = new ArrayList<>();
|
||||||
|
HashMap<ApplicationId, AMSimulator> map = new HashMap<>();
|
||||||
app.init(1000, containers, rm, null, 0, 1000000L, "user1", queue, true,
|
app.init(1000, containers, rm, null, 0, 1000000L, "user1", queue, true,
|
||||||
appId, 0, SLSConfiguration.getAMContainerResource(conf), null, null);
|
appId, 0, SLSConfiguration.getAMContainerResource(conf), null, null,
|
||||||
|
map);
|
||||||
app.firstStep();
|
app.firstStep();
|
||||||
|
|
||||||
verifySchedulerMetrics(appId);
|
verifySchedulerMetrics(appId);
|
||||||
@ -169,9 +172,10 @@ public void testAMSimulatorWithNodeLabels() throws Exception {
|
|||||||
String appId = "app1";
|
String appId = "app1";
|
||||||
String queue = "default";
|
String queue = "default";
|
||||||
List<ContainerSimulator> containers = new ArrayList<>();
|
List<ContainerSimulator> containers = new ArrayList<>();
|
||||||
|
HashMap<ApplicationId, AMSimulator> map = new HashMap<>();
|
||||||
app.init(1000, containers, rm, null, 0, 1000000L, "user1", queue, true,
|
app.init(1000, containers, rm, null, 0, 1000000L, "user1", queue, true,
|
||||||
appId, 0, SLSConfiguration.getAMContainerResource(conf),
|
appId, 0, SLSConfiguration.getAMContainerResource(conf), "label1",
|
||||||
"label1", null);
|
null, map);
|
||||||
app.firstStep();
|
app.firstStep();
|
||||||
|
|
||||||
verifySchedulerMetrics(appId);
|
verifySchedulerMetrics(appId);
|
||||||
|
Loading…
Reference in New Issue
Block a user