package uk.ac.imperial.lsds.seepmaster.scheduler.loadbalancing; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import uk.ac.imperial.lsds.seep.api.DataReference; import uk.ac.imperial.lsds.seep.comm.Connection; import uk.ac.imperial.lsds.seep.comm.protocol.ProtocolCommandFactory; import uk.ac.imperial.lsds.seep.comm.protocol.SeepCommand; import uk.ac.imperial.lsds.seep.infrastructure.ControlEndPoint; import uk.ac.imperial.lsds.seep.scheduler.Stage; import uk.ac.imperial.lsds.seepmaster.infrastructure.master.InfrastructureManager; import uk.ac.imperial.lsds.seepmaster.scheduler.CommandToNode; import uk.ac.imperial.lsds.seepmaster.scheduler.ScheduleTracker; public class LocalitySensitiveLoadBalancingStrategy implements LoadBalancingStrategy { @Override public List<CommandToNode> assignWorkToWorkers(Stage stage, InfrastructureManager inf, ScheduleTracker tracker) { List<CommandToNode> ctns = new ArrayList<>(); // Simply get locality information from Stage ControlEndPoint cep = stage.getStageLocation(); Connection cToWorker = new Connection(cep); int euId = cToWorker.getId(); int stageId = stage.getStageId(); Map<Integer, Set<DataReference>> input = stage.getInputDataReferences(); Map<Integer, Set<DataReference>> output = stage.getOutputDataReferences(); SeepCommand esc = ProtocolCommandFactory.buildScheduleStageCommand(stageId, input, output, tracker.getClusterDatasetRegistry().getRankedDatasetForNode(euId, tracker.getScheduleDescription())); CommandToNode ctn = new CommandToNode(esc, cToWorker); ctns.add(ctn); return ctns; } }