Package com.alipay.bluewhale.core.task.common

Source Code of com.alipay.bluewhale.core.task.common.TasksCommon

package com.alipay.bluewhale.core.task.common;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.atomic.AtomicBoolean;

import org.apache.log4j.Logger;

import backtype.storm.Config;
import backtype.storm.generated.Bolt;
import backtype.storm.generated.ComponentObject;
import backtype.storm.generated.Grouping;
import backtype.storm.generated.JavaObject;
import backtype.storm.generated.ShellComponent;
import backtype.storm.generated.SpoutSpec;
import backtype.storm.generated.StateSpoutSpec;
import backtype.storm.generated.StormTopology;
import backtype.storm.spout.ISpout;
import backtype.storm.spout.ShellSpout;
import backtype.storm.task.IBolt;
import backtype.storm.task.ShellBolt;
import backtype.storm.task.TopologyContext;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.utils.TimeCacheMap;
import backtype.storm.utils.Utils;

import com.alipay.bluewhale.core.callback.RunnableCallback;
import com.alipay.bluewhale.core.cluster.StormConfig;
import com.alipay.bluewhale.core.messaging.IConnection;
import com.alipay.bluewhale.core.stats.BaseTaskStatsRolling;
import com.alipay.bluewhale.core.stats.Stats;
import com.alipay.bluewhale.core.task.error.ITaskReportErr;
import com.alipay.bluewhale.core.task.executer.BoltExecutors;
import com.alipay.bluewhale.core.task.executer.SpoutExecutors;
import com.alipay.bluewhale.core.task.group.MkGrouper;
import com.alipay.bluewhale.core.task.transfer.TaskSendTargets;
import com.alipay.bluewhale.core.thrift.Thrift;
import com.alipay.bluewhale.core.utils.StormUtils;
import com.alipay.bluewhale.core.utils.TimeUtils;
import com.alipay.bluewhale.core.work.transfer.WorkerTransfer;

/**
* task�Ĺ��÷���
*
* @author yannian
*
*/
public class TasksCommon {
  private final static Logger LOG = Logger.getLogger(TasksCommon.class);

  public static BaseTaskStatsRolling mk_task_stats(Object obj, int rate) {
    BaseTaskStatsRolling stat=null;
    if (obj instanceof IBolt) {
      stat= Stats.mk_bolt_stats(rate);
    }else{
      stat=Stats.mk_spout_stats(rate);
    }
    return stat;
  }

  public static Long tuple_time_delta(TimeCacheMap start_times, Tuple tuple) {
    Object start_time = start_times.remove(tuple);
    if (start_time != null) {
      return TimeUtils.time_delta_ms((Long) start_time);
    }
    return null;
  }

  public static Long tuple_time_delta(Map start_times, Tuple tuple) {
    Object start_time = start_times.remove(tuple);
    if (start_time != null) {
      return TimeUtils.time_delta_ms((Long) start_time);
    }
    return null;
  }

  public static void put_xor(TimeCacheMap pending, Object key, Object id) {
    //synchronized (pending) {
      Object curr = new Integer(0);
      if (pending.containsKey(key)) {
        curr = pending.get(key);
      }
      pending.put(key, StormUtils.bit_xor(curr, id));
    //}
  }

  public static void put_xor(Map pending, Object key, Object id) {
    //synchronized (pending) {
      Object curr = new Integer(0);
      if (pending.containsKey(key)) {
        curr = pending.get(key);
      }
      pending.put(key, StormUtils.bit_xor(curr, id));
    //}
  }

  /**
   * ��ȡָ��component_id�϶�Ӧ��task-object
   * @param topology
   * @param component_id
   * @return
   */
  public static Object get_task_object(StormTopology topology,
      String component_id) {
    Map<String, SpoutSpec> spouts = topology.get_spouts();
    Map<String, Bolt> bolts = topology.get_bolts();
    Map<String, StateSpoutSpec> state_spouts = topology.get_state_spouts();

    ComponentObject obj = null;
    if (spouts.containsKey(component_id)) {
      obj = spouts.get(component_id).get_spout_object();
    }else if (bolts.containsKey(component_id)) {
      obj = bolts.get(component_id).get_bolt_object();
    }else if (state_spouts.containsKey(component_id)) {
      obj = state_spouts.get(component_id).get_state_spout_object();
    }

    if (obj == null) {
      LOG.error("get_task_object->obj == null");
      throw new RuntimeException("Could not find " + component_id
          + " in " + topology.toString());
    }

    Object componentObject = getSetComponentObject(obj);

    Object rtn=null;

    if (componentObject instanceof JavaObject) {
      rtn=Thrift.instantiateJavaObject((JavaObject) componentObject);
    }else if (componentObject instanceof ShellComponent) {
      if (spouts.containsKey(component_id)) {
        rtn=new ShellSpout((ShellComponent) componentObject);
      } else {
        rtn= new ShellBolt((ShellComponent) componentObject);
      }
    }else{
      rtn=componentObject;
    }
    return rtn;

  }
 
  /**
   * ��ȡ Task Object
   * @param obj
   * @return
   */
  private static Object getSetComponentObject(ComponentObject obj) {
    if (obj.getSetField() == ComponentObject._Fields.SERIALIZED_JAVA) {
      return Utils.deserialize(obj.get_serialized_java());
    } else if (obj.getSetField() == ComponentObject._Fields.JAVA_OBJECT) {
      return obj.get_java_object();
    } else {
      return obj.get_shell();
    }
  }

  // ��ȡ��ǰtask��ÿ��streamӦ��������ЩcommponID,�Լ���������η����
  public static Map<String, Map<String, MkGrouper>> outbound_components(
      TopologyContext topology_context) {
    Map<String, Map<String, MkGrouper>> rr = new HashMap<String, Map<String, MkGrouper>>();

    // <Stream_id,<component,Grouping>>
    Map<String, Map<String, Grouping>> output_groupings = topology_context
        .getThisTargets();

    for (Entry<String, Map<String, Grouping>> entry : output_groupings
        .entrySet()) {

      Map<String, Grouping> component_grouping = entry.getValue();
      String stream_id = entry.getKey();
      Fields out_fields = topology_context.getThisOutputFields(stream_id);

      Map<String, MkGrouper> componentGrouper = new HashMap<String, MkGrouper>();
      for (Entry<String, Grouping> cg : component_grouping.entrySet()) {
        String component = cg.getKey();
        Grouping tgrouping = cg.getValue();
        int num_tasks = topology_context.getComponentTasks(component)
            .size();
        if (num_tasks > 0) {
          MkGrouper grouper = new MkGrouper(out_fields, tgrouping,
              num_tasks);
          componentGrouper.put(component, grouper);
        }
      }
      if (componentGrouper.size() > 0) {
        rr.put(stream_id, componentGrouper);
      }
    }
    return rr;
  }

  // get-readable-name
  public static String get_readable_name(TopologyContext topology_context) {
    return topology_context.getThisComponentId();
  }

  /**
   * ��ȡcomponent��Ӧ��������Ϣ
   * @param storm_conf
   * @param topology_context
   * @param component_id
   * @return
   */
  @SuppressWarnings("unchecked")
  public static Map component_conf(Map storm_conf,
      TopologyContext topology_context, String component_id) {
    List<Object> to_remove = StormConfig.All_CONFIGS();
    to_remove.remove(Config.TOPOLOGY_DEBUG);
    to_remove.remove(Config.TOPOLOGY_MAX_SPOUT_PENDING);
    to_remove.remove(Config.TOPOLOGY_MAX_TASK_PARALLELISM);
    to_remove.remove(Config.TOPOLOGY_TRANSACTIONAL_ID);

    Map<Object,Object> spec_conf = new HashMap<Object,Object>();

    String jconf = topology_context.getComponentCommon(component_id)
        .get_json_conf();
    if (jconf != null) {
      spec_conf = (Map<Object,Object>) StormUtils.from_json(jconf);
    }
    for (Object p : to_remove) {
      spec_conf.remove(p);
    }

    spec_conf.putAll(storm_conf);

    return spec_conf;
  }

  public static RunnableCallback mk_executors(Object _task_obj,
      WorkerTransfer transfer_fn, Map _storm_conf, IConnection _puller,
      TaskSendTargets sendTargets, AtomicBoolean _storm_active_atom,
      TopologyContext _topology_context, TopologyContext _user_context,
      BaseTaskStatsRolling _task_stats, ITaskReportErr _report_error) {
    if (_task_obj instanceof IBolt) {
      return new BoltExecutors((IBolt) _task_obj, transfer_fn,
          _storm_conf, _puller, sendTargets, _storm_active_atom,
          _topology_context, _user_context, _task_stats,
          _report_error);
    }

    if (_task_obj instanceof ISpout) {
      return new SpoutExecutors((ISpout) _task_obj, transfer_fn,
          _storm_conf, _puller, sendTargets, _storm_active_atom,
          _topology_context, _user_context, _task_stats);
    }

    return null;
  }
 


}
TOP

Related Classes of com.alipay.bluewhale.core.task.common.TasksCommon

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.