package resa.evaluation.topology.fp;
import backtype.storm.Config;
import backtype.storm.StormSubmitter;
import backtype.storm.topology.TopologyBuilder;
import backtype.storm.tuple.Fields;
import resa.metrics.RedisMetricsCollector;
import resa.topology.ResaTopologyBuilder;
import resa.util.ConfigUtil;
import resa.util.ResaConfig;
import java.io.File;
/**
* Created by ding on 14-6-6.
*/
public class FrequentPatternTopology implements Constant {
public static void main(String[] args) throws Exception {
Config conf = ConfigUtil.readConfig(new File(args[1]));
if (conf == null) {
throw new RuntimeException("cannot find conf file " + args[1]);
}
ResaConfig resaConfig = ResaConfig.create();
resaConfig.putAll(conf);
// TopologyBuilder builder = new WritableTopologyBuilder();
TopologyBuilder builder = new ResaTopologyBuilder();
int numWorkers = ConfigUtil.getInt(conf, "fp-worker.count", 1);
resaConfig.setNumWorkers(numWorkers);
String host = (String) conf.get("redis.host");
int port = ConfigUtil.getInt(conf, "redis.port", 6379);
String queue = (String) conf.get("redis.queue");
builder.setSpout("input", new SentenceSpout(host, port, queue), ConfigUtil.getInt(conf, "fp.spout.parallelism", 1));
builder.setBolt("generator", new PatternGenerator(), ConfigUtil.getInt(conf, "fp.generator.parallelism", 1))
.shuffleGrouping("input")
.setNumTasks(ConfigUtil.getInt(conf, "fp.generator.tasks", 1));
builder.setBolt("detector", new Detector(), ConfigUtil.getInt(conf, "fp.detector.parallelism", 1))
//doneTODO:
//.fieldsGrouping("generator", new Fields(PATTERN_FIELD))
//.fieldsGrouping("detector", FEEDBACK_STREAM, new Fields(PATTERN_FIELD))
.directGrouping("generator")
.directGrouping("detector", FEEDBACK_STREAM)
.setNumTasks(ConfigUtil.getInt(conf, "fp.detector.tasks", 1));
builder.setBolt("reporter", new PatternReporter(), ConfigUtil.getInt(conf, "fp.reporter.parallelism", 1))
.fieldsGrouping("detector", REPORT_STREAM, new Fields(PATTERN_FIELD))
.setNumTasks(ConfigUtil.getInt(conf, "fp.reporter.tasks", 1));
if (ConfigUtil.getBoolean(conf, "fp.metric.resa", false)) {
resaConfig.addDrsSupport();
resaConfig.put(ResaConfig.REBALANCE_WAITING_SECS, 0);
System.out.println("ResaMetricsCollector is registered");
}
if (ConfigUtil.getBoolean(conf, "fp.metric.redis", true)) {
resaConfig.registerMetricsConsumer(RedisMetricsCollector.class);
System.out.println("RedisMetricsCollector is registered");
}
StormSubmitter.submitTopology(args[0], resaConfig, builder.createTopology());
}
}