package com.alimama.mdrill.topology; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import org.apache.log4j.Logger; import com.alimama.mdrill.topology.assignment.*; import com.alipay.bluewhale.core.cluster.StormClusterState; import com.alipay.bluewhale.core.custom.IAssignment; import com.alipay.bluewhale.core.daemon.NodePort; import com.alipay.bluewhale.core.daemon.supervisor.SupervisorInfo; import com.alipay.bluewhale.core.utils.StormUtils; public class MdrillTaskAssignment implements IAssignment { private static Logger LOG = Logger.getLogger(MdrillTaskAssignment.class); public static String MS_PORTS = "higo.merger.ports"; public static String REALTIME_PORTS = "higo.realtime.ports"; public static String MS_NAME = "higo.merger.componname"; public static String SHARD_NAME = "higo.shard.componname"; public static String REALTIME_NAME = "higo.realtime.componname"; public static String HIGO_FIX_SHARDS = "higo.fixed.shards.assigns"; public static String SHARD_REPLICATION = "higo.assign.shards.replication"; public String topologyId; public StormClusterState zkCluster; public String ms_name; public String shard_name; public String realtime_name; public Integer replication=1; public SupervisorPortType porttype=new SupervisorPortType(); public Map<String, SupervisorInfo> supInfos; public Map topology_conf; @Override public void setup(Map topology_conf, String topologyId, StormClusterState zkCluster, Map<NodePort, List<Integer>> keepAssigned, Map<String, SupervisorInfo> supInfos) { LOG.info("higolog HigoTaskAssignment setup"); this.topology_conf=topology_conf; this.ms_name = String.valueOf(topology_conf.get(MS_NAME)); this.shard_name = String.valueOf(topology_conf.get(SHARD_NAME)); this.realtime_name = String.valueOf(topology_conf.get(REALTIME_NAME)); this.replication = StormUtils.parseInt(topology_conf.containsKey(SHARD_REPLICATION)?topology_conf.get(SHARD_REPLICATION):1); this.supInfos = supInfos; this.topologyId = topologyId; this.zkCluster = zkCluster; this.porttype.setup(topology_conf); } public Map<NodePort, List<Integer>> keeperSlots( Map<NodePort, List<Integer>> aliveAssigned, int numTaskIds, int numWorkers) { Map<NodePort, List<Integer>> rtn=new HashMap<NodePort, List<Integer>>(); rtn.putAll(aliveAssigned); return rtn; } @Override public List<NodePort> slotsAssignment(List<NodePort> freedSlots, int reassign_num, Set<Integer> reassignIds) { return freedSlots; } @Override public Map<Integer, NodePort> tasksAssignment(List<NodePort> reassignSlots, Set<Integer> reassignIds) { if (reassignIds.size() <= 0) { return new HashMap<Integer, NodePort>(); } FreeResources freeResource=new FreeResources(); freeResource.setup(reassignSlots, this.porttype); TaskNeedAssign taskNeedassign=new TaskNeedAssign(); taskNeedassign.setSpecialTask(reassignIds, this); Map<Integer, NodePort> rtn = new HashMap<Integer, NodePort>(); AssignmentByHost assignByHost=new AssignmentByHost(this); rtn.putAll(assignByHost.assignment(freeResource,taskNeedassign)); AssignmentByRandom assignByRandom=new AssignmentByRandom(); rtn.putAll(assignByRandom.assign(freeResource, taskNeedassign)); NodePort tmp=null; for(Entry<Integer, NodePort> e:rtn.entrySet()) { tmp=e.getValue(); break; } if (tmp == null) { tmp = reassignSlots.get(0); } for (Integer tid : taskNeedassign.otherTask) { rtn.put(tid, tmp); } return rtn; } @Override public void cleanup() { } }