YARN-3123. Made YARN CLI show a single completed container even if the app is running. Contributed by Naganarasimha G R.

This commit is contained in:
Zhijie Shen 2015-02-04 16:02:52 -08:00
parent 5f4ef2d13f
commit 30510cff75
3 changed files with 53 additions and 5 deletions

View File

@ -242,6 +242,9 @@ Release 2.7.0 - UNRELEASED
YARN-1723. AMRMClientAsync missing blacklist addition and removal YARN-1723. AMRMClientAsync missing blacklist addition and removal
functionality. (Bartosz Ługowski via sseth) functionality. (Bartosz Ługowski via sseth)
YARN-3123. Made YARN CLI show a single completed container even if the app
is running. (Naganarasimha G R via zjshen)
OPTIMIZATIONS OPTIMIZATIONS
BUG FIXES BUG FIXES

View File

@ -100,6 +100,7 @@
import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.exceptions.ApplicationIdNotProvidedException; import org.apache.hadoop.yarn.exceptions.ApplicationIdNotProvidedException;
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException; import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException;
import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.exceptions.YarnRuntimeException; import org.apache.hadoop.yarn.exceptions.YarnRuntimeException;
import org.apache.hadoop.yarn.security.AMRMTokenIdentifier; import org.apache.hadoop.yarn.security.AMRMTokenIdentifier;
@ -638,7 +639,8 @@ public ContainerReport getContainerReport(ContainerId containerId)
} }
// Even if history-service is enabled, treat all exceptions still the same // Even if history-service is enabled, treat all exceptions still the same
// except the following // except the following
if (e.getClass() != ApplicationNotFoundException.class) { if (e.getClass() != ApplicationNotFoundException.class
&& e.getClass() != ContainerNotFoundException.class) {
throw e; throw e;
} }
return historyClient.getContainerReport(containerId); return historyClient.getContainerReport(containerId);

View File

@ -35,6 +35,7 @@
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -97,6 +98,8 @@
import org.apache.hadoop.yarn.client.api.YarnClientApplication; import org.apache.hadoop.yarn.client.api.YarnClientApplication;
import org.apache.hadoop.yarn.conf.YarnConfiguration; import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.apache.hadoop.yarn.exceptions.ApplicationIdNotProvidedException; import org.apache.hadoop.yarn.exceptions.ApplicationIdNotProvidedException;
import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException;
import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException;
import org.apache.hadoop.yarn.exceptions.YarnException; import org.apache.hadoop.yarn.exceptions.YarnException;
import org.apache.hadoop.yarn.security.client.TimelineDelegationTokenIdentifier; import org.apache.hadoop.yarn.security.client.TimelineDelegationTokenIdentifier;
import org.apache.hadoop.yarn.server.MiniYARNCluster; import org.apache.hadoop.yarn.server.MiniYARNCluster;
@ -372,6 +375,8 @@ public void testGetContainers() throws YarnException, IOException {
@Test(timeout = 10000) @Test(timeout = 10000)
public void testGetContainerReport() throws YarnException, IOException { public void testGetContainerReport() throws YarnException, IOException {
Configuration conf = new Configuration(); Configuration conf = new Configuration();
conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED,
true);
final YarnClient client = new MockYarnClient(); final YarnClient client = new MockYarnClient();
client.init(conf); client.init(conf);
client.start(); client.start();
@ -388,6 +393,12 @@ public void testGetContainerReport() throws YarnException, IOException {
Assert.assertEquals(report.getContainerId().toString(), Assert.assertEquals(report.getContainerId().toString(),
(ContainerId.newContainerId(expectedReports.get(0) (ContainerId.newContainerId(expectedReports.get(0)
.getCurrentApplicationAttemptId(), 1)).toString()); .getCurrentApplicationAttemptId(), 1)).toString());
containerId = ContainerId.newContainerId(appAttemptId, 3);
report = client.getContainerReport(containerId);
Assert.assertNotNull(report);
Assert.assertEquals(report.getContainerId().toString(),
(ContainerId.newContainerId(expectedReports.get(0)
.getCurrentApplicationAttemptId(), 3)).toString());
client.stop(); client.stop();
} }
@ -642,8 +653,23 @@ private List<ContainerReport> getContainersFromAHS(
@Override @Override
public ContainerReport getContainerReport(ContainerId containerId) public ContainerReport getContainerReport(ContainerId containerId)
throws YarnException, IOException { throws YarnException, IOException {
when(mockContainerResponse.getContainerReport()).thenReturn( try {
getContainer(containerId)); ContainerReport container = getContainer(containerId, containers);
when(mockContainerResponse.getContainerReport()).thenReturn(container);
} catch (YarnException e) {
when(rmClient.getContainerReport(any(GetContainerReportRequest.class)))
.thenThrow(e).thenReturn(mockContainerResponse);
}
try {
ContainerReport container =
getContainer(containerId, containersFromAHS);
when(historyClient.getContainerReport(any(ContainerId.class)))
.thenReturn(container);
} catch (YarnException e) {
when(historyClient.getContainerReport(any(ContainerId.class)))
.thenThrow(e);
}
return super.getContainerReport(containerId); return super.getContainerReport(containerId);
} }
@ -661,8 +687,25 @@ public List<ContainerReport> getContainersReport(
return containers.get(appAttemptId); return containers.get(appAttemptId);
} }
public ContainerReport getContainer(ContainerId containerId) { private ContainerReport getContainer(
return containers.get(containerId.getApplicationAttemptId()).get(0); ContainerId containerId,
HashMap<ApplicationAttemptId, List<ContainerReport>> containersToAppAttemptMapping)
throws YarnException, IOException {
List<ContainerReport> containersForAppAttempt =
containersToAppAttemptMapping.get(containerId
.getApplicationAttemptId());
if (containersForAppAttempt == null) {
throw new ApplicationNotFoundException(containerId
.getApplicationAttemptId().getApplicationId() + " is not found ");
}
Iterator<ContainerReport> iterator = containersForAppAttempt.iterator();
while (iterator.hasNext()) {
ContainerReport next = iterator.next();
if (next.getContainerId().equals(containerId)) {
return next;
}
}
throw new ContainerNotFoundException(containerId + " is not found ");
} }
} }