具有保证消息处理功能的WordCount

时间:2014-04-16 15:58:58

标签: java apache-storm

我正在尝试使用保证邮件处理来运行WordCount示例。

有一个喷口

  1. WSpout - 使用msgID发送随机句子。
  2. 和两个螺栓

    1. SplitSentence - 在单词中拆分句子并以锚定方式发出

    2. WordCount - 打印字数。

    3. 我想用下面的代码实现的是当所有计算句子的单词都完成时。必须承认对应于该句子的喷口。

      我只是在 _collector.ack(元组)中承认了最后一个螺栓WordCount。我觉得奇怪的是,尽管在 WordCount.execute()中调用了 ack(),相应的 WSpout.ack()却没有得到调用。默认超时后它总是失败。

      我真的不明白代码的错误。请帮我理解这个问题。 任何帮助表示赞赏。

      以下是完整的代码。

      public class TestTopology {
      
          public static class WSpout implements IRichSpout {
              SpoutOutputCollector _collector;
          Integer msgID = 0;
          @Override
          public void nextTuple() {
              Random _rand = new Random();
              String[] sentences = new String[] { "There two things benefit",
                      " from Storms reliability capabilities",
                      "Specifying a link in the",
                      " tuple tree is " + "called anchoring",
                      " Anchoring is done at ",
                      "the same time you emit a " + "new tuple" };
      
              String message = sentences[_rand.nextInt(sentences.length)];
              _collector.emit(new Values(message), msgID);
              System.out.println(msgID + " " + message);
      
              msgID++;
          }
          @Override
          public void open(Map conf, TopologyContext context,
                  SpoutOutputCollector collector) {
              System.out.println("open");
              _collector = collector;
          }
          @Override
          public void declareOutputFields(OutputFieldsDeclarer declarer) {
              declarer.declare(new Fields("LINE"));
          }
          @Override
          public void ack(Object msgID) {
              System.out.println("ack ------------------- " + msgID);
      
          }
          @Override
          public void fail(Object msgID) {
              System.out.println("fail ----------------- " + msgID);
      
          }
          @Override
          public void activate() {
              // TODO Auto-generated method stub
          }
          @Override
          public void close() {
      
          }
          @Override
          public void deactivate() {
              // TODO Auto-generated method stub
          }
          @Override
          public Map<String, Object> getComponentConfiguration() {
              // TODO Auto-generated method stub
              return null;
          }
      }
      
      public static class SplitSentence extends BaseRichBolt {
          OutputCollector _collector;
          public void prepare(Map conf, TopologyContext context,
                  OutputCollector collector) {
              _collector = collector;
          }
      
          public void execute(Tuple tuple) {
              String sentence = tuple.getString(0);
              for (String word : sentence.split(" ")) {
                  System.out.println(word);
                  _collector.emit(tuple, new Values(word));
              }
              //_collector.ack(tuple);
          }
      
          public void declareOutputFields(OutputFieldsDeclarer declarer) {
              declarer.declare(new Fields("word"));
          }
      }
      
      public static class WordCount extends BaseBasicBolt {
          Map<String, Integer> counts = new HashMap<String, Integer>();
      
          @Override
          public void execute(Tuple tuple, BasicOutputCollector collector) {
              System.out.println("WordCount MSGID : " + tuple.getMessageId());
              String word = tuple.getString(0);
              Integer count = counts.get(word);
              if (count == null)
                  count = 0;
              count++;
              System.out.println(word + " ===> " + count);
              counts.put(word, count);
              collector.emit(new Values(word, count));
          }
          @Override
          public void declareOutputFields(OutputFieldsDeclarer declarer) {
              declarer.declare(new Fields("word", "count"));
          }
      
      }
      
      public static void main(String[] args) throws Exception {
          TopologyBuilder builder = new TopologyBuilder();
          builder.setSpout("spout", new WSpout(), 2);
          builder.setBolt("split", new SplitSentence(), 2).shuffleGrouping(
                  "spout");
          builder.setBolt("count", new WordCount(), 2).fieldsGrouping("split",
                  new Fields("word"));
          Config conf = new Config();
          conf.setDebug(true);
      
          if (args != null && args.length > 0) {
              conf.setNumWorkers(1);
              StormSubmitter.submitTopology(args[0], conf,
                      builder.createTopology());
          } else {
              conf.setMaxTaskParallelism(3);
      
              LocalCluster cluster = new LocalCluster();
              cluster.submitTopology("word-count", conf, builder.createTopology());
              Thread.sleep(10000);
              cluster.shutdown();
          }
      }
      }
      

1 个答案:

答案 0 :(得分:1)

WordCount扩展了BaseBasicBolt,可以确保元组在自动调整中自动获取,就像您在评论中所说的那样。但是,SplitSentence扩展了BaseRichBolt,它需要您手动确认元组。你没有说话,所以元组超时。