package storm.starter; import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.StormSubmitter; import backtype.storm.task.OutputCollector; import backtype.storm.task.TopologyContext; import backtype.storm.testing.TestWordSpout; import backtype.storm.topology.OutputFieldsDeclarer; import backtype.storm.topology.TopologyBuilder; import backtype.storm.topology.base.BaseRichBolt; import backtype.storm.tuple.Fields; import backtype.storm.tuple.Tuple; import backtype.storm.tuple.Values; import backtype.storm.utils.Utils; import java.lang.Thread; import java.util.concurrent.atomic.AtomicInteger; import java.util.Map; public class GrepTopology { public static class GrepBolt extends BaseRichBolt { private static String pattern = "light"; // private static String pattern = "troop"; private AtomicInteger count = new AtomicInteger(0); private long firstTime = 0; OutputCollector _collector; @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { _collector = collector; } @Override public void execute(Tuple tuple) { long time = System.currentTimeMillis(); int cnt = 0; for (String s: tuple.getString(0).split("\n")) { if (s.contains(pattern)) { cnt = count.addAndGet(1); if (cnt == 1) { firstTime = time; } else if (cnt == 10) { _collector.emit(tuple, new Values(count.getAndSet(0), firstTime)); } } } _collector.ack(tuple); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("grep_count", "time")); } } public static class GrepResultBolt extends BaseRichBolt { OutputCollector _collector; private AtomicInteger count = new AtomicInteger(0); private int limit = 0; @Override public void prepare(Map conf, TopologyContext context, OutputCollector collector) { _collector = collector; } @Override public void execute(Tuple tuple) { int cnt = count.addAndGet(tuple.getInteger(0)); if (cnt >= limit) { limit += 1000; long currentTime = System.currentTimeMillis(); long time = tuple.getLong(1); System.out.println("Data Emited @ Time: " + time + " ms. Got Result Time: " + currentTime + " ms. Latency: " + (currentTime - time) + " ms. We got " + count.get() + " tuples"); } _collector.ack(tuple); } @Override public void declareOutputFields(OutputFieldsDeclarer declarer) { declarer.declare(new Fields("result")); } } // public static int BOOK_PER_SEC = 100; public static void main(String[] args) throws Exception { TopologyBuilder builder = new TopologyBuilder(); if(args!=null && args.length > 0) { int nodes = 10; int bookPerSec = Integer.parseInt(args[1]); int blocks = Integer.parseInt(args[2]); // builder.setSpout("SenSpout", new SentenceSource(), nodes); builder.setSpout("SenSpout", new BookSource(bookPerSec, blocks), nodes); builder.setBolt("GrepBolt", new GrepBolt(), nodes * 2) .localOrShuffleGrouping("SenSpout"); builder.setBolt("ResultBolt", new GrepResultBolt(), 1) .localOrShuffleGrouping("GrepBolt"); Config conf = new Config(); // conf.setDebug(true); conf.setNumWorkers(nodes * 4); StormSubmitter.submitTopology(args[0], conf, builder.createTopology()); } else { int nodes = 1; builder.setSpout("SenSpout", new SentenceSource(), nodes); // builder.setSpout("SenSpout", new BookSource(), nodes); builder.setBolt("GrepBolt", new GrepBolt(), nodes) .localOrShuffleGrouping("SenSpout"); builder.setBolt("ResultBolt", new GrepResultBolt(), 1) .localOrShuffleGrouping("GrepBolt"); Config conf = new Config(); conf.setDebug(true); LocalCluster cluster = new LocalCluster(); cluster.submitTopology("GrepTopology", conf, builder.createTopology()); Utils.sleep(100000); cluster.killTopology("GrepTopology"); cluster.shutdown(); } } }