[英]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.