/** * Creates a list of empty {@link TaskGroup} instances for a range of container id's * from the start(inclusive) to end(exclusive) container id. * * @param startContainerId the first container id for which a TaskGroup is needed. * @param endContainerId the first container id AFTER the last TaskGroup that is needed. * @return a set of empty TaskGroup instances corresponding to the range * [startContainerId, endContainerId) */ private List<TaskGroup> createContainers(int startContainerId, int endContainerId) { List<TaskGroup> containers = new ArrayList<>(endContainerId - startContainerId); for (int i = startContainerId; i < endContainerId; i++) { TaskGroup taskGroup = new TaskGroup(String.valueOf(i), new ArrayList<String>()); containers.add(taskGroup); } return containers; }
/** * Assigns tasks from the specified list to containers that have fewer containers than indicated * in taskCountPerContainer. * * @param taskCountPerContainer the expected number of tasks for each container. * @param taskNamesToAssign the list of tasks to assign to the containers. * @param containers the containers (as {@link TaskGroup}) to which the tasks will be assigned. */ // TODO: Change logic from using int arrays to a Map<String, Integer> (id -> taskCount) private void assignTasksToContainers(int[] taskCountPerContainer, List<String> taskNamesToAssign, List<TaskGroup> containers) { for (TaskGroup taskGroup : containers) { for (int j = taskGroup.size(); j < taskCountPerContainer[Integer.valueOf(taskGroup.getContainerId())]; j++) { String taskName = taskNamesToAssign.remove(0); taskGroup.addTaskName(taskName); LOG.info("Assigned task {} to container {}", taskName, taskGroup.getContainerId()); } } }
processorIds.add(processorId); locationIdToProcessors.put(locationId, processorIds); processorIdToTaskGroup.put(processorId, new TaskGroup(processorId, new ArrayList<>())); }); for (String processorId : processorIds) { TaskGroup taskGroup = processorIdToTaskGroup.get(processorId); if (taskGroup.size() < numTasksPerProcessor) { taskGroup.addTaskName(taskModel.getTaskName().getTaskName()); assignedTasks.add(taskModel.getTaskName()); break; if (!assignedTasks.contains(taskModel.getTaskName())) { Optional<TaskGroup> underAssignedTaskGroup = taskGroups.stream() .filter(taskGroup -> taskGroup.size() < numTasksPerProcessor) .findFirst(); if (underAssignedTaskGroup.isPresent()) { underAssignedTaskGroup.get().addTaskName(taskModel.getTaskName().getTaskName()); } else { TaskGroup taskGroup = processorIdToTaskGroup.get(processorIdsCyclicIterator.next()); taskGroup.addTaskName(taskModel.getTaskName().getTaskName()); return TaskGroup.buildContainerModels(taskModels, taskGroups);
if (containerDelta == 0) { LOG.info("Container count has not changed. Reusing previous container models."); return TaskGroup.buildContainerModels(tasks, containers); for (int i = 0; i < prevContainerCount; i++) { TaskGroup taskGroup = containers.get(i); while (taskGroup.size() > expectedTaskCountPerContainer[i]) { taskNamesToReassign.add(taskGroup.removeLastTaskName()); return TaskGroup.buildContainerModels(tasks, containers);
/** * Converts the task->containerId map to an ordered list of {@link TaskGroup} instances. * * @param taskToContainerId a map from each task name to the containerId to which it is assigned. * @return a list of TaskGroups ordered ascending by containerId. */ private List<TaskGroup> getOrderedContainers(Map<TaskName, String> taskToContainerId) { LOG.debug("Got task to container map: {}", taskToContainerId); // Group tasks by container Id Map<String, List<String>> containerIdToTaskNames = new HashMap<>(); for (Map.Entry<TaskName, String> entry : taskToContainerId.entrySet()) { String taskName = entry.getKey().getTaskName(); String containerId = entry.getValue(); List<String> taskNames = containerIdToTaskNames.computeIfAbsent(containerId, k -> new ArrayList<>()); taskNames.add(taskName); } // Build container tasks List<TaskGroup> containerTasks = new ArrayList<>(containerIdToTaskNames.size()); for (int i = 0; i < containerIdToTaskNames.size(); i++) { if (containerIdToTaskNames.get(String.valueOf(i)) == null) throw new IllegalStateException("Task mapping is missing container: " + i); containerTasks.add(new TaskGroup(String.valueOf(i), containerIdToTaskNames.get(String.valueOf(i)))); } return containerTasks; } }