in twill-yarn/src/main/java/org/apache/twill/internal/yarn/AbstractYarnAMClient.java [105:153]
public final synchronized void allocate(float progress, AllocateHandler handler) throws Exception {
// In one allocate cycle, either only do new container request or removal of requests.
// This is a workaround for YARN-314.
// When remove a container request, AMRMClient will send a container request with size = 0
// With bug YARN-314, if we mix the allocate call with new container request of the same priority,
// in some cases the RM would not see the new request (based on sorting of resource capability),
// but rather only see the one with size = 0.
if (removes.isEmpty()) {
for (T request : requests) {
addContainerRequest(request);
}
requests.clear();
} else {
for (T request : removes) {
removeContainerRequest(request);
}
removes.clear();
}
if (!blacklistAdditions.isEmpty() || !blacklistRemovals.isEmpty()) {
updateBlacklist(blacklistAdditions, blacklistRemovals);
blacklistAdditions.clear();
blacklistRemovals.clear();
}
AllocateResult allocateResponse = doAllocate(progress);
List<RunnableProcessLauncher> launchers = allocateResponse.getLaunchers();
if (!launchers.isEmpty()) {
handler.acquired(launchers);
// If no process has been launched through the given launcher, return the container.
for (ProcessLauncher<YarnContainerInfo> l : launchers) {
// This cast always works.
RunnableProcessLauncher launcher = (RunnableProcessLauncher) l;
if (!launcher.isLaunched()) {
YarnContainerInfo containerInfo = launcher.getContainerInfo();
// Casting is needed in Java 8, otherwise it complains about ambiguous method over the info(String, Throwable)
LOG.info("Nothing to run in container, releasing it: {}", (Object) containerInfo.getContainer());
releaseAssignedContainer(containerInfo);
}
}
}
List<YarnContainerStatus> completed = allocateResponse.getCompletedStatus();
if (!completed.isEmpty()) {
handler.completed(completed);
}
}