我正在尝试实施Trident + DRPC。我设计的拓扑结构不会无限期地运行。我有两个单独的类,一个用于spout实现,另一个用于实现DRPC和Trident。我的spout类(扩展IRichSpout的spout)会发出客户的id。即。
public class TriSpout implements IRichSpout{
//some logic here
spoutOutputCollector.emit(new Values(id))
}
现在我从另一个使用DRPC实现Trident的类中获取了输出收集器的值。
public class TriDrpc{
.....
TriSpout spout=new TriSpout1();
TridentTopology topology = new TridentTopology();
TridentState wordCounts =
topology.newStream("spout1",spout)
.parallelismHint(1)
.each(new Fields("id"), new Compute(), new Fields("value"))
.persistentAggregate(new MemoryMapState.Factory(),
new Count(), new Fields("count"))
和drpc拓扑def如下
topology.newDRPCStream("Calc", drpc)
.each(new Fields("args"), new Split(), new Fields("word"))
.stateQuery(wordCounts, new Fields("word"), new MapGet(), new Fields("count"));
DRPC请求如下
public static void main(String[] args) throws Exception {
Config conf = new Config();
if (args.length == 0) {
LocalDRPC drpc = new LocalDRPC();
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("Calculator", conf, buildTopology(drpc));
System.out.println("DRPC RESULT: "
+ drpc.execute("Calc", "id"));
Thread.sleep(1000);
} else {
conf.setNumWorkers(8);
StormSubmitter.submitTopology(args[0], conf, buildTopology(null));
}
}
现在在上面的代码中,在DRPC请求中,即
System.out.println("DRPC RESULT: " + drpc.execute("Calc", "id"));
"id"
应该与spout发出的id相同,即我想知道哪个客户有使用此ID的活动帐户,所以我需要发送DRPC请求,以查看spout发出的所有id。现在DRPC在主类中,如何在不指定id的情况下将spout发出的值传递给DRPC请求?
有人可以帮忙吗
以新信息编辑
答案 0 :(得分:3)
嗯,现在你的问题更清楚了,谢谢。
因此,您需要处理DRPC请求,以获得与DRPC的拓扑喷口相同的ID。
您可以实现此目的的唯一方法是将您从spout发出的ID保存到Storm外部持久存储(例如,RDMS或分布式hashmap)。
这样,在提交拓扑以便在Storm群集上执行之后,您可以轮询持久存储以获取新ID,并为每个新ID执行DRPC请求。
我认为我不明白这个问题。您是否尝试使用从同一DRPC拓扑的spout输出中获取的请求ID参数来执行Storm DRPC请求?我不认为这是DRPC拓扑的有效和有意使用。您最好使用普通拓扑。
DRPC拓扑用于有限计算,而普通拓扑用于连续计算。 DRPC调用接收DRPC拓扑的名称,以及用于计算DRPC调用结果的一组输入参数。普通风暴(或三叉戟)拓扑只是无限期地运行,计算某种结果并坚持它。
我希望这会有所帮助。如果没有,请更好地重新表述你的问题,因为你的问题并不是很清楚。