package com.alimama.mdrill.topology.assignment; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import org.apache.log4j.Logger; import com.alipay.bluewhale.core.daemon.NodePort; public class AssignmentByRandom { private static Logger LOG = Logger.getLogger(AssignmentByRandom.class); public Map<Integer, NodePort> assign(FreeResources resources,TaskNeedAssign jobids) { Map<Integer, NodePort> shardAssignRandom =this.randomAssign(resources.shard, jobids.shardTask); Map<Integer, NodePort> msAssignRandom =this.randomAssign(resources.ms, jobids.msTask); Map<Integer, NodePort> realtimeAssignRandom =this.randomAssign(resources.realtime, jobids.realtimeTask); Map<Integer, NodePort> rtn = new HashMap<Integer, NodePort>(); rtn.putAll(shardAssignRandom); rtn.putAll(msAssignRandom); rtn.putAll(realtimeAssignRandom); return rtn; } private Map<Integer, NodePort> randomAssign(HashSet<NodePort> resource,HashMap<Integer,HashSet<Integer>> jobids) { Map<Integer, NodePort> rtn = new HashMap<Integer, NodePort>(); for(Entry<Integer, HashSet<Integer>> e:jobids.entrySet()) { rtn.putAll(randomAssign(resource, e.getValue())); } return rtn; } private Map<Integer, NodePort> randomAssign(HashSet<NodePort> resource,HashSet<Integer> jobids) { Map<Integer, NodePort> rtn = new HashMap<Integer, NodePort>(); if(jobids.size()<=0) { return rtn; } Integer index = 0; NodePort[] nodes=new NodePort[resource.size()]; resource.toArray(nodes); for (Integer tid : jobids) { if(index>=nodes.length) { break; } NodePort np = nodes[index]; rtn.put(tid, np); LOG.info("higolog random assign:" + tid + "==>" + np.getPort()); index++; } for (Entry<Integer, NodePort> e : rtn.entrySet()) { jobids.remove(e.getKey()); resource.remove(e.getValue()); } return rtn; } }