|
@@ -18,6 +18,8 @@
|
|
|
|
|
|
package org.apache.hadoop.yarn.server.resourcemanager.rmcontainer;
|
|
package org.apache.hadoop.yarn.server.resourcemanager.rmcontainer;
|
|
|
|
|
|
|
|
+import static org.apache.hadoop.yarn.util.StringHelper.join;
|
|
|
|
+
|
|
import java.util.EnumSet;
|
|
import java.util.EnumSet;
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
|
|
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
|
|
@@ -25,9 +27,12 @@ import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;
|
|
|
|
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
+import org.apache.hadoop.http.HttpConfig;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
|
|
import org.apache.hadoop.yarn.api.records.Container;
|
|
import org.apache.hadoop.yarn.api.records.Container;
|
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
import org.apache.hadoop.yarn.api.records.ContainerId;
|
|
|
|
+import org.apache.hadoop.yarn.api.records.ContainerState;
|
|
|
|
+import org.apache.hadoop.yarn.api.records.ContainerStatus;
|
|
import org.apache.hadoop.yarn.api.records.NodeId;
|
|
import org.apache.hadoop.yarn.api.records.NodeId;
|
|
import org.apache.hadoop.yarn.api.records.Priority;
|
|
import org.apache.hadoop.yarn.api.records.Priority;
|
|
import org.apache.hadoop.yarn.api.records.Resource;
|
|
import org.apache.hadoop.yarn.api.records.Resource;
|
|
@@ -40,6 +45,7 @@ import org.apache.hadoop.yarn.state.InvalidStateTransitonException;
|
|
import org.apache.hadoop.yarn.state.SingleArcTransition;
|
|
import org.apache.hadoop.yarn.state.SingleArcTransition;
|
|
import org.apache.hadoop.yarn.state.StateMachine;
|
|
import org.apache.hadoop.yarn.state.StateMachine;
|
|
import org.apache.hadoop.yarn.state.StateMachineFactory;
|
|
import org.apache.hadoop.yarn.state.StateMachineFactory;
|
|
|
|
+import org.apache.hadoop.yarn.util.ConverterUtils;
|
|
|
|
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
@SuppressWarnings({"unchecked", "rawtypes"})
|
|
public class RMContainerImpl implements RMContainer {
|
|
public class RMContainerImpl implements RMContainer {
|
|
@@ -135,15 +141,21 @@ public class RMContainerImpl implements RMContainer {
|
|
private final Container container;
|
|
private final Container container;
|
|
private final EventHandler eventHandler;
|
|
private final EventHandler eventHandler;
|
|
private final ContainerAllocationExpirer containerAllocationExpirer;
|
|
private final ContainerAllocationExpirer containerAllocationExpirer;
|
|
|
|
+ private final String user;
|
|
|
|
|
|
private Resource reservedResource;
|
|
private Resource reservedResource;
|
|
private NodeId reservedNode;
|
|
private NodeId reservedNode;
|
|
private Priority reservedPriority;
|
|
private Priority reservedPriority;
|
|
|
|
+ private long startTime;
|
|
|
|
+ private long finishTime;
|
|
|
|
+ private String logURL;
|
|
|
|
+ private ContainerStatus finishedStatus;
|
|
|
|
|
|
public RMContainerImpl(Container container,
|
|
public RMContainerImpl(Container container,
|
|
ApplicationAttemptId appAttemptId, NodeId nodeId,
|
|
ApplicationAttemptId appAttemptId, NodeId nodeId,
|
|
EventHandler handler,
|
|
EventHandler handler,
|
|
- ContainerAllocationExpirer containerAllocationExpirer) {
|
|
|
|
|
|
+ ContainerAllocationExpirer containerAllocationExpirer,
|
|
|
|
+ String user) {
|
|
this.stateMachine = stateMachineFactory.make(this);
|
|
this.stateMachine = stateMachineFactory.make(this);
|
|
this.containerId = container.getId();
|
|
this.containerId = container.getId();
|
|
this.nodeId = nodeId;
|
|
this.nodeId = nodeId;
|
|
@@ -151,6 +163,8 @@ public class RMContainerImpl implements RMContainer {
|
|
this.appAttemptId = appAttemptId;
|
|
this.appAttemptId = appAttemptId;
|
|
this.eventHandler = handler;
|
|
this.eventHandler = handler;
|
|
this.containerAllocationExpirer = containerAllocationExpirer;
|
|
this.containerAllocationExpirer = containerAllocationExpirer;
|
|
|
|
+ this.user = user;
|
|
|
|
+ this.startTime = System.currentTimeMillis();
|
|
|
|
|
|
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
|
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
|
|
this.readLock = lock.readLock();
|
|
this.readLock = lock.readLock();
|
|
@@ -197,7 +211,77 @@ public class RMContainerImpl implements RMContainer {
|
|
public Priority getReservedPriority() {
|
|
public Priority getReservedPriority() {
|
|
return reservedPriority;
|
|
return reservedPriority;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Resource getAllocatedResource() {
|
|
|
|
+ return container.getResource();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public NodeId getAllocatedNode() {
|
|
|
|
+ return container.getNodeId();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public Priority getAllocatedPriority() {
|
|
|
|
+ return container.getPriority();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public long getStartTime() {
|
|
|
|
+ return startTime;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public long getFinishTime() {
|
|
|
|
+ try {
|
|
|
|
+ readLock.lock();
|
|
|
|
+ return finishTime;
|
|
|
|
+ } finally {
|
|
|
|
+ readLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public String getDiagnosticsInfo() {
|
|
|
|
+ try {
|
|
|
|
+ readLock.lock();
|
|
|
|
+ return finishedStatus.getDiagnostics();
|
|
|
|
+ } finally {
|
|
|
|
+ readLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public String getLogURL() {
|
|
|
|
+ try {
|
|
|
|
+ readLock.lock();
|
|
|
|
+ return logURL;
|
|
|
|
+ } finally {
|
|
|
|
+ readLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public int getContainerExitStatus() {
|
|
|
|
+ try {
|
|
|
|
+ readLock.lock();
|
|
|
|
+ return finishedStatus.getExitStatus();
|
|
|
|
+ } finally {
|
|
|
|
+ readLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public ContainerState getContainerState() {
|
|
|
|
+ try {
|
|
|
|
+ readLock.lock();
|
|
|
|
+ return finishedStatus.getState();
|
|
|
|
+ } finally {
|
|
|
|
+ readLock.unlock();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public String toString() {
|
|
public String toString() {
|
|
return containerId.toString();
|
|
return containerId.toString();
|
|
@@ -276,6 +360,12 @@ public class RMContainerImpl implements RMContainer {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
public void transition(RMContainerImpl container, RMContainerEvent event) {
|
|
public void transition(RMContainerImpl container, RMContainerEvent event) {
|
|
|
|
+ // The logs of running containers should be found on NM webUI
|
|
|
|
+ // The logs should be accessible after the container is launched
|
|
|
|
+ container.logURL = join(HttpConfig.getSchemePrefix(),
|
|
|
|
+ container.container.getNodeHttpAddress(), "/node", "/containerlogs/",
|
|
|
|
+ ConverterUtils.toString(container.containerId), "/",
|
|
|
|
+ container.user);
|
|
// Unregister from containerAllocationExpirer.
|
|
// Unregister from containerAllocationExpirer.
|
|
container.containerAllocationExpirer.unregister(container
|
|
container.containerAllocationExpirer.unregister(container
|
|
.getContainerId());
|
|
.getContainerId());
|
|
@@ -288,6 +378,11 @@ public class RMContainerImpl implements RMContainer {
|
|
public void transition(RMContainerImpl container, RMContainerEvent event) {
|
|
public void transition(RMContainerImpl container, RMContainerEvent event) {
|
|
RMContainerFinishedEvent finishedEvent = (RMContainerFinishedEvent) event;
|
|
RMContainerFinishedEvent finishedEvent = (RMContainerFinishedEvent) event;
|
|
|
|
|
|
|
|
+ container.finishTime = System.currentTimeMillis();
|
|
|
|
+ container.finishedStatus = finishedEvent.getRemoteContainerStatus();
|
|
|
|
+ // TODO: when AHS webUI is ready, logURL should be updated to point to
|
|
|
|
+ // the web page that will show the aggregated logs
|
|
|
|
+
|
|
// Inform AppAttempt
|
|
// Inform AppAttempt
|
|
container.eventHandler.handle(new RMAppAttemptContainerFinishedEvent(
|
|
container.eventHandler.handle(new RMAppAttemptContainerFinishedEvent(
|
|
container.appAttemptId, finishedEvent.getRemoteContainerStatus()));
|
|
container.appAttemptId, finishedEvent.getRemoteContainerStatus()));
|