YARN-3123. Made YARN CLI show a single completed container even if the app is running. Contributed by Naganarasimha G R.
(cherry picked from commit 30510cff75
)
This commit is contained in:
parent
17797c73c2
commit
2db56a4932
|
@ -208,6 +208,9 @@ Release 2.7.0 - UNRELEASED
|
|||
YARN-1723. AMRMClientAsync missing blacklist addition and removal
|
||||
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
|
||||
|
||||
BUG FIXES
|
||||
|
|
|
@ -100,6 +100,7 @@ import org.apache.hadoop.yarn.client.api.YarnClientApplication;
|
|||
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||
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.YarnRuntimeException;
|
||||
import org.apache.hadoop.yarn.security.AMRMTokenIdentifier;
|
||||
|
@ -638,7 +639,8 @@ public class YarnClientImpl extends YarnClient {
|
|||
}
|
||||
// Even if history-service is enabled, treat all exceptions still the same
|
||||
// except the following
|
||||
if (e.getClass() != ApplicationNotFoundException.class) {
|
||||
if (e.getClass() != ApplicationNotFoundException.class
|
||||
&& e.getClass() != ContainerNotFoundException.class) {
|
||||
throw e;
|
||||
}
|
||||
return historyClient.getContainerReport(containerId);
|
||||
|
|
|
@ -35,6 +35,7 @@ import java.util.Collections;
|
|||
import java.util.EnumSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
|
@ -97,6 +98,8 @@ import org.apache.hadoop.yarn.client.api.YarnClient;
|
|||
import org.apache.hadoop.yarn.client.api.YarnClientApplication;
|
||||
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||
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.security.client.TimelineDelegationTokenIdentifier;
|
||||
import org.apache.hadoop.yarn.server.MiniYARNCluster;
|
||||
|
@ -372,6 +375,8 @@ public class TestYarnClient {
|
|||
@Test(timeout = 10000)
|
||||
public void testGetContainerReport() throws YarnException, IOException {
|
||||
Configuration conf = new Configuration();
|
||||
conf.setBoolean(YarnConfiguration.APPLICATION_HISTORY_ENABLED,
|
||||
true);
|
||||
final YarnClient client = new MockYarnClient();
|
||||
client.init(conf);
|
||||
client.start();
|
||||
|
@ -388,6 +393,12 @@ public class TestYarnClient {
|
|||
Assert.assertEquals(report.getContainerId().toString(),
|
||||
(ContainerId.newContainerId(expectedReports.get(0)
|
||||
.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();
|
||||
}
|
||||
|
||||
|
@ -642,8 +653,23 @@ public class TestYarnClient {
|
|||
@Override
|
||||
public ContainerReport getContainerReport(ContainerId containerId)
|
||||
throws YarnException, IOException {
|
||||
when(mockContainerResponse.getContainerReport()).thenReturn(
|
||||
getContainer(containerId));
|
||||
try {
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -661,8 +687,25 @@ public class TestYarnClient {
|
|||
return containers.get(appAttemptId);
|
||||
}
|
||||
|
||||
public ContainerReport getContainer(ContainerId containerId) {
|
||||
return containers.get(containerId.getApplicationAttemptId()).get(0);
|
||||
private ContainerReport getContainer(
|
||||
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 ");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue