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.IntermediateRankingsBolt;
import storm.applications.bolt.RollingCountBolt;
import storm.applications.bolt.TopicExtractorBolt;
import storm.applications.bolt.TotalRankingsBolt;
import storm.applications.constants.TrendingTopicsConstants.Component;
import storm.applications.constants.TrendingTopicsConstants.Conf;
import storm.applications.constants.TrendingTopicsConstants.Field;
import static storm.applications.constants.TrendingTopicsConstants.PREFIX;
public class TrendingTopicsTopology extends BasicTopology {
private static final Logger LOG = LoggerFactory.getLogger(TrendingTopicsTopology.class);
private int topicExtractorThreads;
private int counterThreads;
private int iRankerThreads;
private int tRankerThreads;
private int topk;
private int counterFrequency;
private int iRankerFrequency;
private int tRankerFrequnecy;
public TrendingTopicsTopology(String topologyName, Config config) {
super(topologyName, config);
}
@Override
public void initialize() {
super.initialize();
topicExtractorThreads = config.getInt(Conf.TOPIC_EXTRACTOR_THREADS, 1);
counterThreads = config.getInt(Conf.COUNTER_THREADS, 1);
iRankerThreads = config.getInt(Conf.IRANKER_THREADS, 1);
tRankerThreads = config.getInt(Conf.IRANKER_THREADS, 1);
topk = config.getInt(Conf.TOPK, 10);
counterFrequency = config.getInt(Conf.COUNTER_FREQ, 60);
iRankerFrequency = config.getInt(Conf.IRANKER_FREQ, 2);
tRankerFrequnecy = config.getInt(Conf.TRANKER_FREQ, 2);
}
@Override
public StormTopology buildTopology() {
spout.setFields(new Fields(Field.TWEET));
builder.setSpout(Component.SPOUT, spout, spoutThreads);
builder.setBolt(Component.TOPIC_EXTRACTOR, new TopicExtractorBolt(), topicExtractorThreads)
.shuffleGrouping(Component.SPOUT);
builder.setBolt(Component.COUNTER, new RollingCountBolt(counterFrequency), counterThreads)
.fieldsGrouping(Component.TOPIC_EXTRACTOR, new Fields(Field.WORD));
builder.setBolt(Component.INTERMEDIATE_RANKER, new IntermediateRankingsBolt(topk, iRankerFrequency), iRankerThreads)
.fieldsGrouping(Component.COUNTER, new Fields(Field.OBJ));
builder.setBolt(Component.TOTAL_RANKER, new TotalRankingsBolt(topk, tRankerFrequnecy), tRankerThreads)
.globalGrouping(Component.INTERMEDIATE_RANKER);
builder.setBolt(Component.SINK, sink, sinkThreads)
.shuffleGrouping(Component.TOTAL_RANKER);
return builder.createTopology();
}
@Override
public Logger getLogger() {
return LOG;
}
@Override
public String getConfigPrefix() {
return PREFIX;
}
}