YARN-6962. Add support for updateContainers when allocating using FederationInterceptor. (Botong Huang via Subru).
(cherry picked from commit ca669f9f8bc7abe5b7d4648c589aa1756bd336d1)
This commit is contained in:
parent
d6da014f67
commit
ffcf5ba1ce
@ -540,33 +540,36 @@ private Map<SubClusterId, AllocateRequest> splitAllocateRequest(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.getResourceBlacklistRequest() != null && !isNullOrEmpty(
|
if (request.getResourceBlacklistRequest() != null) {
|
||||||
|
if (!isNullOrEmpty(
|
||||||
request.getResourceBlacklistRequest().getBlacklistAdditions())) {
|
request.getResourceBlacklistRequest().getBlacklistAdditions())) {
|
||||||
for (String resourceName : request.getResourceBlacklistRequest()
|
for (String resourceName : request.getResourceBlacklistRequest()
|
||||||
.getBlacklistAdditions()) {
|
.getBlacklistAdditions()) {
|
||||||
SubClusterId subClusterId = getSubClusterForNode(resourceName);
|
SubClusterId subClusterId = getSubClusterForNode(resourceName);
|
||||||
if (subClusterId != null) {
|
if (subClusterId != null) {
|
||||||
AllocateRequest newRequest = findOrCreateAllocateRequestForSubCluster(
|
AllocateRequest newRequest =
|
||||||
subClusterId, request, requestMap);
|
findOrCreateAllocateRequestForSubCluster(subClusterId, request,
|
||||||
|
requestMap);
|
||||||
newRequest.getResourceBlacklistRequest().getBlacklistAdditions()
|
newRequest.getResourceBlacklistRequest().getBlacklistAdditions()
|
||||||
.add(resourceName);
|
.add(resourceName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!isNullOrEmpty(
|
||||||
if (request.getResourceBlacklistRequest() != null && !isNullOrEmpty(
|
|
||||||
request.getResourceBlacklistRequest().getBlacklistRemovals())) {
|
request.getResourceBlacklistRequest().getBlacklistRemovals())) {
|
||||||
for (String resourceName : request.getResourceBlacklistRequest()
|
for (String resourceName : request.getResourceBlacklistRequest()
|
||||||
.getBlacklistRemovals()) {
|
.getBlacklistRemovals()) {
|
||||||
SubClusterId subClusterId = getSubClusterForNode(resourceName);
|
SubClusterId subClusterId = getSubClusterForNode(resourceName);
|
||||||
if (subClusterId != null) {
|
if (subClusterId != null) {
|
||||||
AllocateRequest newRequest = findOrCreateAllocateRequestForSubCluster(
|
AllocateRequest newRequest =
|
||||||
subClusterId, request, requestMap);
|
findOrCreateAllocateRequestForSubCluster(subClusterId, request,
|
||||||
|
requestMap);
|
||||||
newRequest.getResourceBlacklistRequest().getBlacklistRemovals()
|
newRequest.getResourceBlacklistRequest().getBlacklistRemovals()
|
||||||
.add(resourceName);
|
.add(resourceName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!isNullOrEmpty(request.getReleaseList())) {
|
if (!isNullOrEmpty(request.getReleaseList())) {
|
||||||
for (ContainerId cid : request.getReleaseList()) {
|
for (ContainerId cid : request.getReleaseList()) {
|
||||||
@ -896,13 +899,8 @@ private void mergeAllocateResponse(AllocateResponse homeResponse,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isNullOrEmpty(otherResponse.getNMTokens())) {
|
homeResponse.setNumClusterNodes(
|
||||||
if (!isNullOrEmpty(homeResponse.getNMTokens())) {
|
homeResponse.getNumClusterNodes() + otherResponse.getNumClusterNodes());
|
||||||
homeResponse.getNMTokens().addAll(otherResponse.getNMTokens());
|
|
||||||
} else {
|
|
||||||
homeResponse.setNMTokens(otherResponse.getNMTokens());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PreemptionMessage homePreempMessage = homeResponse.getPreemptionMessage();
|
PreemptionMessage homePreempMessage = homeResponse.getPreemptionMessage();
|
||||||
PreemptionMessage otherPreempMessage = otherResponse.getPreemptionMessage();
|
PreemptionMessage otherPreempMessage = otherResponse.getPreemptionMessage();
|
||||||
@ -935,6 +933,31 @@ private void mergeAllocateResponse(AllocateResponse homeResponse,
|
|||||||
spar1.getContainers().addAll(spar2.getContainers());
|
spar1.getContainers().addAll(spar2.getContainers());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(otherResponse.getNMTokens())) {
|
||||||
|
if (!isNullOrEmpty(homeResponse.getNMTokens())) {
|
||||||
|
homeResponse.getNMTokens().addAll(otherResponse.getNMTokens());
|
||||||
|
} else {
|
||||||
|
homeResponse.setNMTokens(otherResponse.getNMTokens());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(otherResponse.getUpdatedContainers())) {
|
||||||
|
if (!isNullOrEmpty(homeResponse.getUpdatedContainers())) {
|
||||||
|
homeResponse.getUpdatedContainers()
|
||||||
|
.addAll(otherResponse.getUpdatedContainers());
|
||||||
|
} else {
|
||||||
|
homeResponse.setUpdatedContainers(otherResponse.getUpdatedContainers());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isNullOrEmpty(otherResponse.getUpdateErrors())) {
|
||||||
|
if (!isNullOrEmpty(homeResponse.getUpdateErrors())) {
|
||||||
|
homeResponse.getUpdateErrors().addAll(otherResponse.getUpdateErrors());
|
||||||
|
} else {
|
||||||
|
homeResponse.setUpdateErrors(otherResponse.getUpdateErrors());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1052,6 +1075,11 @@ public int getUnmanagedAMPoolSize() {
|
|||||||
return this.uamPool.getAllUAMIds().size();
|
return this.uamPool.getAllUAMIds().size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public Map<SubClusterId, List<AllocateResponse>> getAsyncResponseSink() {
|
||||||
|
return this.asyncResponseSink;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Private structure for encapsulating SubClusterId and
|
* Private structure for encapsulating SubClusterId and
|
||||||
* RegisterApplicationMasterResponse instances.
|
* RegisterApplicationMasterResponse instances.
|
||||||
|
@ -20,7 +20,9 @@
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.ExecutorCompletionService;
|
import java.util.concurrent.ExecutorCompletionService;
|
||||||
@ -36,8 +38,15 @@
|
|||||||
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.ContainerStatus;
|
||||||
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
|
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
|
||||||
|
import org.apache.hadoop.yarn.api.records.NMToken;
|
||||||
|
import org.apache.hadoop.yarn.api.records.NodeReport;
|
||||||
|
import org.apache.hadoop.yarn.api.records.PreemptionMessage;
|
||||||
|
import org.apache.hadoop.yarn.api.records.Resource;
|
||||||
import org.apache.hadoop.yarn.api.records.ResourceRequest;
|
import org.apache.hadoop.yarn.api.records.ResourceRequest;
|
||||||
|
import org.apache.hadoop.yarn.api.records.UpdateContainerError;
|
||||||
|
import org.apache.hadoop.yarn.api.records.UpdatedContainer;
|
||||||
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
import org.apache.hadoop.yarn.conf.YarnConfiguration;
|
||||||
import org.apache.hadoop.yarn.exceptions.InvalidApplicationMasterRequestException;
|
import org.apache.hadoop.yarn.exceptions.InvalidApplicationMasterRequestException;
|
||||||
import org.apache.hadoop.yarn.exceptions.YarnException;
|
import org.apache.hadoop.yarn.exceptions.YarnException;
|
||||||
@ -493,4 +502,49 @@ public void testTwoDifferentRegisterRequest() throws Exception {
|
|||||||
} catch (YarnException e) {
|
} catch (YarnException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllocateResponse() throws Exception {
|
||||||
|
interceptor.registerApplicationMaster(
|
||||||
|
RegisterApplicationMasterRequest.newInstance(null, 0, null));
|
||||||
|
AllocateRequest allocateRequest = Records.newRecord(AllocateRequest.class);
|
||||||
|
|
||||||
|
Map<SubClusterId, List<AllocateResponse>> asyncResponseSink =
|
||||||
|
interceptor.getAsyncResponseSink();
|
||||||
|
|
||||||
|
ContainerId cid = ContainerId.newContainerId(attemptId, 0);
|
||||||
|
ContainerStatus cStatus = Records.newRecord(ContainerStatus.class);
|
||||||
|
cStatus.setContainerId(cid);
|
||||||
|
Container container =
|
||||||
|
Container.newInstance(cid, null, null, null, null, null);
|
||||||
|
|
||||||
|
AllocateResponse response = Records.newRecord(AllocateResponse.class);
|
||||||
|
response.setAllocatedContainers(Collections.singletonList(container));
|
||||||
|
response.setCompletedContainersStatuses(Collections.singletonList(cStatus));
|
||||||
|
response.setUpdatedNodes(
|
||||||
|
Collections.singletonList(Records.newRecord(NodeReport.class)));
|
||||||
|
response.setNMTokens(
|
||||||
|
Collections.singletonList(Records.newRecord(NMToken.class)));
|
||||||
|
response.setUpdatedContainers(
|
||||||
|
Collections.singletonList(Records.newRecord(UpdatedContainer.class)));
|
||||||
|
response.setUpdateErrors(Collections
|
||||||
|
.singletonList(Records.newRecord(UpdateContainerError.class)));
|
||||||
|
response.setAvailableResources(Records.newRecord(Resource.class));
|
||||||
|
response.setPreemptionMessage(Records.newRecord(PreemptionMessage.class));
|
||||||
|
|
||||||
|
List<AllocateResponse> list = new ArrayList<>();
|
||||||
|
list.add(response);
|
||||||
|
asyncResponseSink.put(SubClusterId.newInstance("SC-1"), list);
|
||||||
|
|
||||||
|
response = interceptor.allocate(allocateRequest);
|
||||||
|
|
||||||
|
Assert.assertEquals(1, response.getAllocatedContainers().size());
|
||||||
|
Assert.assertNotNull(response.getAvailableResources());
|
||||||
|
Assert.assertEquals(1, response.getCompletedContainersStatuses().size());
|
||||||
|
Assert.assertEquals(1, response.getUpdatedNodes().size());
|
||||||
|
Assert.assertNotNull(response.getPreemptionMessage());
|
||||||
|
Assert.assertEquals(1, response.getNMTokens().size());
|
||||||
|
Assert.assertEquals(1, response.getUpdatedContainers().size());
|
||||||
|
Assert.assertEquals(1, response.getUpdateErrors().size());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user