簡體   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