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.GlobalMedianCalculatorBolt; import storm.applications.bolt.HouseLoadPredictorBolt; import storm.applications.bolt.OutlierDetectionBolt; import storm.applications.bolt.PlugLoadPredictorBolt; import storm.applications.bolt.PlugMedianCalculatorBolt; import storm.applications.bolt.SmartGridSlidingWindowBolt; import static storm.applications.constants.SmartGridConstants.*; import storm.applications.sink.BaseSink; import storm.applications.spout.AbstractSpout; /** * * @author mayconbordin */ public class SmartGridTopology extends AbstractTopology { private static final Logger LOG = LoggerFactory.getLogger(SmartGridTopology.class); private AbstractSpout spout; private BaseSink outlierSink; private BaseSink predictionSink; private int spoutThreads; private int outlierSinkThreads; private int predictionSinkThreads; private int slidingWindowThreads; private int globalMedianThreads; private int plugMedianThreads; private int outlierDetectorThreads; private int houseLoadThreads; private int plugLoadThreads; private int houseLoadFrequency; private int plugLoadFrequency; public SmartGridTopology(String topologyName, Config config) { super(topologyName, config); } @Override public void initialize() { spout = loadSpout(); outlierSink = loadSink("outlier"); predictionSink = loadSink("prediction"); spoutThreads = config.getInt(getConfigKey(Conf.SPOUT_THREADS), 1); outlierSinkThreads = config.getInt(getConfigKey(Conf.SINK_THREADS, "outlier"), 1); predictionSinkThreads = config.getInt(getConfigKey(Conf.SINK_THREADS, "prediction"), 1); slidingWindowThreads = config.getInt(Conf.SLIDING_WINDOW_THREADS, 1); globalMedianThreads = config.getInt(Conf.SLIDING_WINDOW_THREADS, 1); plugMedianThreads = config.getInt(Conf.SLIDING_WINDOW_THREADS, 1); outlierDetectorThreads = config.getInt(Conf.SLIDING_WINDOW_THREADS, 1); houseLoadThreads = config.getInt(Conf.SLIDING_WINDOW_THREADS, 1); plugLoadThreads = config.getInt(Conf.SLIDING_WINDOW_THREADS, 1); houseLoadFrequency = config.getInt(Conf.HOUSE_LOAD_FREQUENCY, 15); plugLoadFrequency = config.getInt(Conf.PLUG_LOAD_FREQUENCY, 15); } @Override public StormTopology buildTopology() { spout.setFields(new Fields(Field.ID, Field.TIMESTAMP, Field.VALUE, Field.PROPERTY, Field.PLUG_ID, Field.HOUSEHOLD_ID, Field.HOUSE_ID)); builder.setSpout(Component.SPOUT, spout, spoutThreads); builder.setBolt(Component.SLIDING_WINDOW, new SmartGridSlidingWindowBolt(), slidingWindowThreads) .globalGrouping(Component.SPOUT); // Outlier detection builder.setBolt(Component.GLOBAL_MEDIAN, new GlobalMedianCalculatorBolt(), globalMedianThreads) .globalGrouping(Component.SLIDING_WINDOW); builder.setBolt(Component.PLUG_MEDIAN, new PlugMedianCalculatorBolt(), plugMedianThreads) .fieldsGrouping(Component.SLIDING_WINDOW, new Fields(Field.HOUSE_ID, Field.HOUSEHOLD_ID, Field.PLUG_ID)); builder.setBolt(Component.OUTLIER_DETECTOR, new OutlierDetectionBolt(), outlierDetectorThreads) .allGrouping(Component.GLOBAL_MEDIAN) .fieldsGrouping(Component.PLUG_MEDIAN, new Fields(Field.PLUG_SPECIFIC_KEY)); // Load prediction builder.setBolt(Component.HOUSE_LOAD, new HouseLoadPredictorBolt(houseLoadFrequency), houseLoadThreads) .fieldsGrouping(Component.SPOUT, new Fields(Field.HOUSE_ID)); builder.setBolt(Component.PLUG_LOAD, new PlugLoadPredictorBolt(plugLoadFrequency), plugLoadThreads) .fieldsGrouping(Component.SPOUT, new Fields(Field.HOUSE_ID)); // Sinks builder.setBolt(Component.OUTLIER_SINK, outlierSink, outlierSinkThreads) .shuffleGrouping(Component.OUTLIER_DETECTOR); builder.setBolt(Component.PREDICTION_SINK, predictionSink, predictionSinkThreads) .fieldsGrouping(Component.HOUSE_LOAD, new Fields(Field.HOUSE_ID)) .fieldsGrouping(Component.PLUG_LOAD, new Fields(Field.HOUSE_ID)); return builder.createTopology(); } @Override public Logger getLogger() { return LOG; } @Override public String getConfigPrefix() { return PREFIX; } }