簡體   English   中英

Apache Storm Trident-動態創建拓撲

[英]Apache storm Trident - creating topologies dynamically

有什么方法可以在三叉戟中動態創建拓撲嗎? 有人可以提供例子嗎?

首先,您可能還知道創建拓撲不是Trident的一部分。 Trident只是微批處理的API。

根據定義,創建新拓撲是動態的。 這就是TopologyBuilder類正在做的事情。

因此,要回答您的問題,是的,可以從Trident或簡單的Storm噴口和螺栓創建新的拓撲。 您唯一需要做的就是您的拓撲創建邏輯應該有權訪問Storm集群(類和其他資源),如果您在Storm中運行邏輯,就定義而言,這再次滿足。

您需要做的最后一件事是找到一種提交新創建的拓撲的方法,這就是制作StormSubmitter類的目的,再次滿足您在類路徑上運行時的定義(!surprise :))三叉戟或普通噴嘴/螺栓內部的邏輯。

出於好奇,您為什么打算這樣做? 你有什么要求

例:

import java.util.Map;

import org.apache.storm.Config;
import org.apache.storm.StormSubmitter;
import org.apache.storm.generated.StormTopology;
import org.apache.storm.spout.SpoutOutputCollector;
import org.apache.storm.task.TopologyContext;
import org.apache.storm.topology.OutputFieldsDeclarer;
import org.apache.storm.topology.TopologyBuilder;
import org.apache.storm.topology.base.BaseRichSpout;
import org.apache.storm.trident.operation.TridentCollector;
import org.apache.storm.trident.spout.IBatchSpout;
import org.apache.storm.tuple.Fields;

public class DynamicTopologySpout implements IBatchSpout {

    private static final long serialVersionUID = -3269435263455830842L;

    @Override
    @SuppressWarnings("rawtypes")
    public void open(Map conf, TopologyContext context) {}

    @Override
    public void emitBatch(long batchId, TridentCollector collector) {
        if (newTopologyNeeded()) {
            TopologyBuilder builder = new TopologyBuilder();
            builder
            .setSpout("spout", new BaseRichSpout() {
                private static final long serialVersionUID = 1L;
                @Override public void declareOutputFields(OutputFieldsDeclarer declarer) {}
                @Override @SuppressWarnings("rawtypes") public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {}
                @Override public void nextTuple() {}
            }, 1)
            .setMaxSpoutPending(15)
            .setNumTasks(1);
            StormTopology topology = builder.createTopology();
            Config config = new Config();
            try {
                StormSubmitter.submitTopology("dynamic-topology", config, topology);
            } catch (Exception e) {
                e.printStackTrace();
                collector.reportError(e);
            }
        }
    }

    private boolean newTopologyNeeded() {
        // Check if topology needed ...
        return false;
    }

    @Override
    public void ack(long batchId) {}

    @Override
    public void close() {}

    @Override
    public Map<String, Object> getComponentConfiguration() { return null; }

    @Override
    public Fields getOutputFields() { return null; }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM