繁体   English   中英

将数据从一个 bolt 发送到另一个 Apache Storm

[英]Send data from one bolt to another Apache Storm

嗨,与Apache Storm 我有多个 kafka 主题,我想使用单个螺栓(并行处理负载)解析所有消息。

我想问一下可以吗? 以下是我正在尝试的

Collection<SpoutSpec<? extends BaseRichBolt>> spouts; // I take this as a method argument

TopologyBuilder topology = new TopologyBuilder();

    spouts.forEach(spec -> {
        topology.setSpout(spec.getName() + "Spout", new KafkaSpout(spec.getSpoutConfig()), spec.getParallelism());
        topology.setBolt("FileBeat-Bolt", new FileBeatMessageBolt(), spec.getParallelism()).shuffleGrouping(spec.getName() + "Spout");
        topology.setBolt("Message-Handling-Bolt", new MessageHandlingBolt(), spec.getParallelism()).shuffleGrouping("FileBeat-Bolt");
        topology.setBolt("Output-Kafka-Bolt", new ProcessedOutputHandler(), spec.getParallelism()).shuffleGrouping("Message-Handling-Bolt");
    });

我的 SpoutSpec 类

public class SpoutSpec<T extends BaseRichBolt> {

    private final String name;

    private final int parallelism;

    private final SpoutConfig spoutConfig;

    private final T handler;

}

但是消息不会从FileBeat-Bolt发送到其他螺栓。 以下是我发出数据的方式:

JsonNode jsonNode = objectMapper.readValue(input.getString(0), JsonNode.class);

String topic = jsonNode.get("@metadata").get("topic").getTextValue();

String message = jsonNode.get("message").getTextValue();

collector.emit("Message-Handling-Bolt", input, new Values(topic, message));

你的emit电话是错误的。 第一个参数不是螺栓名称,而是流名称。 流名称用于将消息从 Bolt 划分为多个数据流的情况。 在您的情况下,您不想拆分流。

collector.emit("Message-Handling-Bolt", input, new Values(topic, message));

将发送到一个名为“Message-Handling-Bolt”的流,并且您在该流上没有任何监听。 您的“消息处理螺栓”正在侦听默认流。 无论是第一个参数下降到emit ,或更改您的螺栓声明如下:

topology.setBolt("Message-Handling-Bolt", new MessageHandlingBolt(), spec.getParallelism()).shuffleGrouping("FileBeat-Bolt", "Message-Handling-Bolt");

编辑:回应您的评论:对您来说最简单的解决方案是简单地删除发送调用中的第一个参数:

collector.emit(input, new Values(topic, message));

如果出于某种原因您不想这样做,并且想要明确命名流,则需要声明您的FileBeatMessageBolt将发送到Message-Handling-Bolt流。 您可以将其作为declareOutputFields实现的一部分来执行:

@Override
public void declareOutputFields(OutputFieldsDeclarer declarer) {
    declarer.declareStream("Message-Handling-Bolt", new Fields(...));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM