|
@@ -18,6 +18,7 @@
|
|
|
|
|
|
package org.apache.hadoop.yarn.server.resourcemanager.rmapp;
|
|
package org.apache.hadoop.yarn.server.resourcemanager.rmapp;
|
|
|
|
|
|
|
|
+import java.util.Collection;
|
|
import java.util.EnumSet;
|
|
import java.util.EnumSet;
|
|
import java.util.HashSet;
|
|
import java.util.HashSet;
|
|
import java.util.LinkedHashMap;
|
|
import java.util.LinkedHashMap;
|
|
@@ -47,12 +48,15 @@ import org.apache.hadoop.yarn.server.resourcemanager.RMAppManagerEvent;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.RMAppManagerEventType;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.RMAppManagerEventType;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.RMContext;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.recovery.ApplicationsStore.ApplicationStore;
|
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmapp.RMAppNodeUpdateEvent.RMAppNodeUpdateType;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.resource.Resources;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttempt;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEvent;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEvent;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEventType;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptEventType;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmapp.attempt.RMAppAttemptImpl;
|
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNode;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeCleanAppEvent;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeCleanAppEvent;
|
|
|
|
+import org.apache.hadoop.yarn.server.resourcemanager.rmnode.RMNodeState;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
|
|
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.YarnScheduler;
|
|
import org.apache.hadoop.yarn.state.InvalidStateTransitonException;
|
|
import org.apache.hadoop.yarn.state.InvalidStateTransitonException;
|
|
import org.apache.hadoop.yarn.state.MultipleArcTransition;
|
|
import org.apache.hadoop.yarn.state.MultipleArcTransition;
|
|
@@ -87,6 +91,7 @@ public class RMAppImpl implements RMApp {
|
|
private final Map<ApplicationAttemptId, RMAppAttempt> attempts
|
|
private final Map<ApplicationAttemptId, RMAppAttempt> attempts
|
|
= new LinkedHashMap<ApplicationAttemptId, RMAppAttempt>();
|
|
= new LinkedHashMap<ApplicationAttemptId, RMAppAttempt>();
|
|
private final long submitTime;
|
|
private final long submitTime;
|
|
|
|
+ private final Set<RMNode> updatedNodes = new HashSet<RMNode>();
|
|
|
|
|
|
// Mutable fields
|
|
// Mutable fields
|
|
private long startTime;
|
|
private long startTime;
|
|
@@ -107,6 +112,8 @@ public class RMAppImpl implements RMApp {
|
|
|
|
|
|
|
|
|
|
// Transitions from NEW state
|
|
// Transitions from NEW state
|
|
|
|
+ .addTransition(RMAppState.NEW, RMAppState.NEW,
|
|
|
|
+ RMAppEventType.NODE_UPDATE, new RMAppNodeUpdateTransition())
|
|
.addTransition(RMAppState.NEW, RMAppState.SUBMITTED,
|
|
.addTransition(RMAppState.NEW, RMAppState.SUBMITTED,
|
|
RMAppEventType.START, new StartAppAttemptTransition())
|
|
RMAppEventType.START, new StartAppAttemptTransition())
|
|
.addTransition(RMAppState.NEW, RMAppState.KILLED, RMAppEventType.KILL,
|
|
.addTransition(RMAppState.NEW, RMAppState.KILLED, RMAppEventType.KILL,
|
|
@@ -115,6 +122,8 @@ public class RMAppImpl implements RMApp {
|
|
RMAppEventType.APP_REJECTED, new AppRejectedTransition())
|
|
RMAppEventType.APP_REJECTED, new AppRejectedTransition())
|
|
|
|
|
|
// Transitions from SUBMITTED state
|
|
// Transitions from SUBMITTED state
|
|
|
|
+ .addTransition(RMAppState.SUBMITTED, RMAppState.SUBMITTED,
|
|
|
|
+ RMAppEventType.NODE_UPDATE, new RMAppNodeUpdateTransition())
|
|
.addTransition(RMAppState.SUBMITTED, RMAppState.FAILED,
|
|
.addTransition(RMAppState.SUBMITTED, RMAppState.FAILED,
|
|
RMAppEventType.APP_REJECTED, new AppRejectedTransition())
|
|
RMAppEventType.APP_REJECTED, new AppRejectedTransition())
|
|
.addTransition(RMAppState.SUBMITTED, RMAppState.ACCEPTED,
|
|
.addTransition(RMAppState.SUBMITTED, RMAppState.ACCEPTED,
|
|
@@ -123,6 +132,8 @@ public class RMAppImpl implements RMApp {
|
|
RMAppEventType.KILL, new KillAppAndAttemptTransition())
|
|
RMAppEventType.KILL, new KillAppAndAttemptTransition())
|
|
|
|
|
|
// Transitions from ACCEPTED state
|
|
// Transitions from ACCEPTED state
|
|
|
|
+ .addTransition(RMAppState.ACCEPTED, RMAppState.ACCEPTED,
|
|
|
|
+ RMAppEventType.NODE_UPDATE, new RMAppNodeUpdateTransition())
|
|
.addTransition(RMAppState.ACCEPTED, RMAppState.RUNNING,
|
|
.addTransition(RMAppState.ACCEPTED, RMAppState.RUNNING,
|
|
RMAppEventType.ATTEMPT_REGISTERED)
|
|
RMAppEventType.ATTEMPT_REGISTERED)
|
|
.addTransition(RMAppState.ACCEPTED,
|
|
.addTransition(RMAppState.ACCEPTED,
|
|
@@ -133,6 +144,8 @@ public class RMAppImpl implements RMApp {
|
|
RMAppEventType.KILL, new KillAppAndAttemptTransition())
|
|
RMAppEventType.KILL, new KillAppAndAttemptTransition())
|
|
|
|
|
|
// Transitions from RUNNING state
|
|
// Transitions from RUNNING state
|
|
|
|
+ .addTransition(RMAppState.RUNNING, RMAppState.RUNNING,
|
|
|
|
+ RMAppEventType.NODE_UPDATE, new RMAppNodeUpdateTransition())
|
|
.addTransition(RMAppState.RUNNING, RMAppState.FINISHED,
|
|
.addTransition(RMAppState.RUNNING, RMAppState.FINISHED,
|
|
RMAppEventType.ATTEMPT_FINISHED, FINAL_TRANSITION)
|
|
RMAppEventType.ATTEMPT_FINISHED, FINAL_TRANSITION)
|
|
.addTransition(RMAppState.RUNNING,
|
|
.addTransition(RMAppState.RUNNING,
|
|
@@ -145,10 +158,16 @@ public class RMAppImpl implements RMApp {
|
|
// Transitions from FINISHED state
|
|
// Transitions from FINISHED state
|
|
.addTransition(RMAppState.FINISHED, RMAppState.FINISHED,
|
|
.addTransition(RMAppState.FINISHED, RMAppState.FINISHED,
|
|
RMAppEventType.KILL)
|
|
RMAppEventType.KILL)
|
|
|
|
+ // ignorable transitions
|
|
|
|
+ .addTransition(RMAppState.FINISHED, RMAppState.FINISHED,
|
|
|
|
+ RMAppEventType.NODE_UPDATE)
|
|
|
|
|
|
// Transitions from FAILED state
|
|
// Transitions from FAILED state
|
|
.addTransition(RMAppState.FAILED, RMAppState.FAILED,
|
|
.addTransition(RMAppState.FAILED, RMAppState.FAILED,
|
|
RMAppEventType.KILL)
|
|
RMAppEventType.KILL)
|
|
|
|
+ // ignorable transitions
|
|
|
|
+ .addTransition(RMAppState.FAILED, RMAppState.FAILED,
|
|
|
|
+ RMAppEventType.NODE_UPDATE)
|
|
|
|
|
|
// Transitions from KILLED state
|
|
// Transitions from KILLED state
|
|
.addTransition(
|
|
.addTransition(
|
|
@@ -158,6 +177,9 @@ public class RMAppImpl implements RMApp {
|
|
RMAppEventType.APP_REJECTED, RMAppEventType.KILL,
|
|
RMAppEventType.APP_REJECTED, RMAppEventType.KILL,
|
|
RMAppEventType.ATTEMPT_FINISHED, RMAppEventType.ATTEMPT_FAILED,
|
|
RMAppEventType.ATTEMPT_FINISHED, RMAppEventType.ATTEMPT_FAILED,
|
|
RMAppEventType.ATTEMPT_KILLED))
|
|
RMAppEventType.ATTEMPT_KILLED))
|
|
|
|
+ // ignorable transitions
|
|
|
|
+ .addTransition(RMAppState.KILLED, RMAppState.KILLED,
|
|
|
|
+ RMAppEventType.NODE_UPDATE)
|
|
|
|
|
|
.installTopology();
|
|
.installTopology();
|
|
|
|
|
|
@@ -330,6 +352,18 @@ public class RMAppImpl implements RMApp {
|
|
throw new YarnException("Unknown state passed!");
|
|
throw new YarnException("Unknown state passed!");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public int pullRMNodeUpdates(Collection<RMNode> updatedNodes) {
|
|
|
|
+ this.writeLock.lock();
|
|
|
|
+ try {
|
|
|
|
+ int updatedNodeCount = this.updatedNodes.size();
|
|
|
|
+ updatedNodes.addAll(this.updatedNodes);
|
|
|
|
+ this.updatedNodes.clear();
|
|
|
|
+ return updatedNodeCount;
|
|
|
|
+ } finally {
|
|
|
|
+ this.writeLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public ApplicationReport createAndGetApplicationReport(boolean allowAccess) {
|
|
public ApplicationReport createAndGetApplicationReport(boolean allowAccess) {
|
|
@@ -462,6 +496,13 @@ public class RMAppImpl implements RMApp {
|
|
handler.handle(
|
|
handler.handle(
|
|
new RMAppAttemptEvent(appAttemptId, RMAppAttemptEventType.START));
|
|
new RMAppAttemptEvent(appAttemptId, RMAppAttemptEventType.START));
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private void processNodeUpdate(RMAppNodeUpdateType type, RMNode node) {
|
|
|
|
+ RMNodeState nodeState = node.getState();
|
|
|
|
+ updatedNodes.add(node);
|
|
|
|
+ LOG.debug("Received node update event:" + type + " for node:" + node
|
|
|
|
+ + " with state:" + nodeState);
|
|
|
|
+ }
|
|
|
|
|
|
private static class RMAppTransition implements
|
|
private static class RMAppTransition implements
|
|
SingleArcTransition<RMAppImpl, RMAppEvent> {
|
|
SingleArcTransition<RMAppImpl, RMAppEvent> {
|
|
@@ -470,6 +511,14 @@ public class RMAppImpl implements RMApp {
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ private static final class RMAppNodeUpdateTransition extends RMAppTransition {
|
|
|
|
+ public void transition(RMAppImpl app, RMAppEvent event) {
|
|
|
|
+ RMAppNodeUpdateEvent nodeUpdateEvent = (RMAppNodeUpdateEvent) event;
|
|
|
|
+ app.processNodeUpdate(nodeUpdateEvent.getUpdateType(),
|
|
|
|
+ nodeUpdateEvent.getNode());
|
|
|
|
+ };
|
|
|
|
+ }
|
|
|
|
+
|
|
private static final class StartAppAttemptTransition extends RMAppTransition {
|
|
private static final class StartAppAttemptTransition extends RMAppTransition {
|
|
public void transition(RMAppImpl app, RMAppEvent event) {
|
|
public void transition(RMAppImpl app, RMAppEvent event) {
|
|
app.createNewAttempt();
|
|
app.createNewAttempt();
|