Storm - 拓扑到拓扑

时间:2015-01-14 06:24:29

标签: apache-storm

是否可以将元组从一个拓扑发布到另一个拓扑?

让我们说在一个拓扑中,一个特定的螺栓正在将元组存储到db中。在另一种拓扑结构中,我不想复制或创建用于存储元组的相同螺栓。那么从第二个拓扑结构可以发射到第一个拓扑螺栓吗?

-Hariprasad

3 个答案:

答案 0 :(得分:1)

虽然您无法直接将元组从一个拓扑传递到另一个拓扑,但您可以使用排队系统(如Apache Kafka)来完成您所描述的内容。 Storm在其最新版本中打包了Kafka喷口。

答案 1 :(得分:1)

设置需要两个风暴拓扑(A和B)和一个Kafka主题。我们称之为“转移”

在要将数据发送到B拓扑的A拓扑中,使用Kafka生产者:

[kafka初始化代码直接来自文档:https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+Producer+Example,显然需要为您的kafka安装进行自定义。]

public void Execute(Tuple input){
...
  Properties props = new Properties();
  props.put("metadata.broker.list", "broker1:9092,broker2:9092 ");
  props.put("serializer.class", "kafka.serializer.StringEncoder");
  props.put("partitioner.class", "example.producer.SimplePartitioner");
  props.put("request.required.acks", "1"); 

  ProducerConfig config = new ProducerConfig(props);

  Producer<String, String> producer = new Producer<String, String (config);
  String msg = ... 
  KeyedMessage<String, String> data = new KeyedMessage<String, String>
      ("transfers", ip, msg);
  producer.send(data);
  producer.close();

从拓扑B,您在初始化拓扑时创建Kafka Spout:

BrokerHosts hosts = new ZkHosts(zkConnString);
SpoutConfig spoutConfig = new SpoutConfig(hosts, topicName, "/" + topicName, 
    UUID.randomUUID().toString());
spoutConf.scheme = new SchemeAsMultiScheme(new StringScheme());
KafkaSpout kafkaSpout = new KafkaSpout(spoutConfig);

// Now it's just like any other spout
topologyBuilder.setSpout(kafkaSpout);

这需要运行kafka,当然(请查看https://kafka.apache.org/08/quickstart.html)。

[编辑:再次阅读你的问题:听起来你有一个可重用的组件(保存元组),你想从两个不同的拓扑调用,而你试图从另一个调用一个。另一种方法是将此任务卸载到专用于处理保存元组的第三个拓扑,并仅创建需要在拓扑中保留的项目的kafka消息。这样,save-tuple的所有事件都将以相同的方式处理。]

答案 2 :(得分:0)

目前不支持此功能,您无法将元组从一个拓扑传递到另一个拓扑。 根据您的用例,为什么不使用订阅db bolt而不是运行单独拓扑的另一个螺栓(在同一拓扑内)