package storm.applications.topology; import backtype.storm.Config; import backtype.storm.generated.StormTopology; import backtype.storm.tuple.Fields; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import storm.applications.bolt.AlertTriggerBolt; import storm.applications.bolt.ObservationScoreBolt; import storm.applications.bolt.SlidingWindowStreamAnomalyScoreBolt; import static storm.applications.constants.MachineOutlierConstants.*; public class MachineOutlierTopology extends BasicTopology { private static final Logger LOG = LoggerFactory.getLogger(MachineOutlierTopology.class); private int scorerThreads; private int anomalyScorerThreads; private int alertTriggerThreads; public MachineOutlierTopology(String topologyName, Config config) { super(topologyName, config); } @Override public void initialize() { super.initialize(); scorerThreads = config.getInt(Conf.SCORER_THREADS, 1); anomalyScorerThreads = config.getInt(Conf.ANOMALY_SCORER_THREADS, 1); alertTriggerThreads = config.getInt(Conf.ALERT_TRIGGER_THREADS, 1); } @Override public StormTopology buildTopology() { spout.setFields(new Fields(Field.ID, Field.TIMESTAMP, Field.OBSERVATION)); builder.setSpout(Component.SPOUT, spout, spoutThreads); builder.setBolt(Component.SCORER, new ObservationScoreBolt(), scorerThreads) .shuffleGrouping(Component.SPOUT); builder.setBolt(Component.ANOMALY_SCORER, new SlidingWindowStreamAnomalyScoreBolt(), anomalyScorerThreads) .fieldsGrouping(Component.SCORER, new Fields(Field.ID)); builder.setBolt(Component.ALERT_TRIGGER, new AlertTriggerBolt(), alertTriggerThreads) .shuffleGrouping(Component.ANOMALY_SCORER); builder.setBolt(Component.SINK, sink, sinkThreads) .shuffleGrouping(Component.ALERT_TRIGGER); return builder.createTopology(); } @Override public Logger getLogger() { return LOG; } @Override public String getConfigPrefix() { return PREFIX; } }