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.RollingCtrBolt;
import static storm.applications.constants.AdsAnalyticsConstants.*;
/**
*
* @author Maycon Viana Bordin <mayconbordin@gmail.com>
*/
public class AdsAnalyticsTopology extends BasicTopology {
private static final Logger LOG = LoggerFactory.getLogger(AdsAnalyticsTopology.class);
private int ctrThreads;
private int ctrFrequency;
public AdsAnalyticsTopology(String topologyName, Config config) {
super(topologyName, config);
}
@Override
public void initialize() {
super.initialize();
ctrThreads = config.getInt(Conf.CTR_THREADS, 1);
ctrFrequency = config.getInt(Conf.CTR_EMIT_FREQUENCY, 60);
}
@Override
public StormTopology buildTopology() {
Fields spoutFields = new Fields(Field.QUERY_ID, Field.AD_ID, Field.EVENT);
spout.setFields(Stream.CLICKS, spoutFields);
spout.setFields(Stream.IMPRESSIONS, spoutFields);
builder.setSpout(Component.SPOUT, spout, spoutThreads);
builder.setBolt(Component.CTR, new RollingCtrBolt(ctrFrequency), ctrThreads)
.fieldsGrouping(Component.SPOUT, Stream.CLICKS, new Fields(Field.QUERY_ID, Field.AD_ID))
.fieldsGrouping(Component.SPOUT, Stream.IMPRESSIONS, new Fields(Field.QUERY_ID, Field.AD_ID));
builder.setBolt(Component.SINK, sink, sinkThreads)
.shuffleGrouping(Component.CTR);
return builder.createTopology();
}
@Override
public Logger getLogger() {
return LOG;
}
@Override
public String getConfigPrefix() {
return PREFIX;
}
}