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.MovingAverageBolt;
import storm.applications.bolt.SpikeDetectionBolt;
import static storm.applications.constants.SpikeDetectionConstants.*;
/**
* Detects spikes in values emitted from sensors.
* http://github.com/surajwaghulde/storm-example-projects
*
* @author surajwaghulde
*/
public class SpikeDetectionTopology extends BasicTopology {
private static final Logger LOG = LoggerFactory.getLogger(SpikeDetectionTopology.class);
private int movingAverageThreads;
private int spikeDetectorThreads;
public SpikeDetectionTopology(String topologyName, Config config) {
super(topologyName, config);
}
@Override
public void initialize() {
super.initialize();
movingAverageThreads = config.getInt(Conf.MOVING_AVERAGE_THREADS, 1);
spikeDetectorThreads = config.getInt(Conf.SPIKE_DETECTOR_THREADS, 1);
}
@Override
public StormTopology buildTopology() {
spout.setFields(new Fields(Field.DEVICE_ID, Field.TIMESTAMP, Field.VALUE));
builder.setSpout(Component.SPOUT, spout, spoutThreads);
builder.setBolt(Component.MOVING_AVERAGE, new MovingAverageBolt(), movingAverageThreads)
.fieldsGrouping(Component.SPOUT, new Fields(Field.DEVICE_ID));
builder.setBolt(Component.SPIKE_DETECTOR, new SpikeDetectionBolt(), spikeDetectorThreads)
.shuffleGrouping(Component.MOVING_AVERAGE);
builder.setBolt(Component.SINK, sink, sinkThreads)
.shuffleGrouping(Component.SPIKE_DETECTOR);
return builder.createTopology();
}
@Override
public Logger getLogger() {
return LOG;
}
@Override
public String getConfigPrefix() {
return PREFIX;
}
}