package com.alipay.bluewhale.core.work; import java.io.IOException; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.log4j.Logger; import backtype.storm.Config; import backtype.storm.generated.Grouping; import backtype.storm.task.TopologyContext; import backtype.storm.utils.LocalState; import com.alipay.bluewhale.core.cluster.Common; import com.alipay.bluewhale.core.cluster.StormClusterState; import com.alipay.bluewhale.core.cluster.StormConfig; import com.alipay.bluewhale.core.daemon.NodePort; import com.alipay.bluewhale.core.task.common.Assignment; import com.alipay.bluewhale.core.utils.TimeUtils; import com.alipay.bluewhale.core.work.context.SystemContextMake; import com.alipay.bluewhale.core.work.refresh.WorkerHeartbeat; /** * worker utils * * @author yannian * */ public class WorkCommon { private static Logger LOG = Logger.getLogger(WorkCommon.class); /** * �Ƿ�ʹ��zmq���ַ���Ϣ */ @SuppressWarnings("rawtypes") public static boolean localModeZmq(Map conf) { String clusterMode = StormConfig.cluster_mode(conf); Boolean isDistribute = clusterMode.equals("distributed"); String key = Config.STORM_LOCAL_MODE_ZMQ; if (isDistribute || conf.get(key).equals(Boolean.TRUE)) { return true; } return false; } /** * ��zk�ж�ȡ��ǰwork�����task */ public static java.util.Set<Integer> readWorkerTaskids(StormClusterState zkCluster, String topologyid,String supervisorId, int port) { Set<Integer> tasks = null; Assignment assignmentInfo = zkCluster.assignment_info(topologyid, null); if (assignmentInfo != null) { tasks = new HashSet<Integer>(); Map<Integer, NodePort> taskToNodeport = assignmentInfo.getTaskToNodeport(); for (Entry<Integer, NodePort> taskNode : taskToNodeport.entrySet()) { NodePort loc = taskNode.getValue(); if (loc != null && loc.getNode().equals(supervisorId)&& loc.getPort() == port) { tasks.add(taskNode.getKey()); } } LOG.info("readWorkerTaskids topologyid=" + topologyid + ",port=" + port + ",supervisorId=" + supervisorId + ",tasks.size=" + tasks.size() + "," + assignmentInfo.toString()); } return tasks; } /** * work���������������±���Ŀ¼ * * @throws IOException */ @SuppressWarnings("rawtypes") public static void doHeartbeat(Map conf, String worker_id, int port, String storm_id, Set<Integer> task_ids) throws IOException { int currtime = TimeUtils.current_time_secs(); WorkerHeartbeat hb = new WorkerHeartbeat(currtime, storm_id, task_ids, port); LOG.debug("Doing heartbeat:" + worker_id + ",port:" + port + ",hb" + hb.toString()); LocalState state = StormConfig.worker_state(conf, worker_id); state.put(Common.LS_WORKER_HEARTBEAT, hb); } /** * ���� ÿ��taskid��������tupple�п���������Щtasks��������������ʹ�� * * @param tasks_component * @param mk_topology_context * @param task_ids */ public static Set<Integer> worker_outbound_tasks( HashMap<Integer, String> tasks_component, SystemContextMake mk_topology_context, Set<Integer> task_ids) { Set<Integer> rtn = null; if (task_ids != null) { rtn= new HashSet<Integer>(); for (Integer taskid : task_ids) { TopologyContext context = mk_topology_context.make(taskid); if(context!=null){ // <StreamId,<ComponentId,Grouping>> Map<String, Map<String, Grouping>> targets = context.getThisTargets(); for (Map<String, Grouping> e : targets.values()) { for (String componentId : e.keySet()) { List<Integer> tasks= context.getComponentTasks(componentId); rtn.addAll(tasks); } } } } } return rtn; } }