Storm Cluster重复元组

时间:2014-05-20 15:37:07

标签: java apache-storm esper

目前我正在开发一个项目,我在四个Unix主机上设置了一个Storm集群。

拓扑本身如下:

  1. JMS Spout侦听MQ以获取新消息
  2. JMS Spout解析然后将结果发送到Esper Bolt
  3. Esper Bolt然后处理事件并将结果发送到JMS Bolt
  4. 然后,JMS Bolt将消息发布回MQ上的另一个主题
  5. 我意识到Storm是一个"至少一次"框架。但是,如果我收到5个事件并将这些事件传递给Esper Bolt进行计数,那么由于某种原因,我在JMS Bolt中获得了5个计数结果(所有相同的值)。

    理想情况下,我希望收到一个结果输出,是否有某种方法我可以告诉Storm忽略重复的元组?

    我认为这与我设置的并行性有关,因为当我只有一个线程时它会按预期工作:

     TopologyBuilder builder = new TopologyBuilder();
        builder.setSpout(JMS_DATA_SPOUT, new JMSDataSpout(),2).setNumTasks(2);
        builder.setBolt("esperBolt", new EsperBolt.Builder().build(),6).setNumTasks(6)
                .fieldsGrouping(JMS_DATA_SPOUT,new Fields("eventGrouping"));
        builder.setBolt("jmsBolt", new JMSBolt(),2).setNumTasks(2).fieldsGrouping("esperBolt", new Fields("eventName"));
    

    我也看过三叉戟'#34;确切一次"语义。我并不完全相信这会解决这个问题。

1 个答案:

答案 0 :(得分:0)

如果你的Esper Bolt没有在execute()方法的末尾显式地确认ack()每个元组或者使用iBasicBolt实现,那么它接收的每个元组最终会在超时后由你的原始JMS Spout重放。

或者,如果您要求您的“仅处理唯一消息”,请考虑将此处理行为添加到execute()方法中。它可以首先检查本地Guava缓存的元组值唯一性,然后进行相应的处理。