要从spout输出收集器传递值到DRPC请求?

时间:2013-09-19 13:47:01

标签: apache-storm trident

我正在尝试实施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请求?

有人可以帮忙吗

以新信息编辑

1 个答案:

答案 0 :(得分:3)

更新

嗯,现在你的问题更清楚了,谢谢。

因此,您需要处理DRPC请求,以获得与DRPC的拓扑喷口相同的ID。

您可以实现此目的的唯一方法是将您从spout发出的ID保存到Storm外部持久存储(例如,RDMS或分布式hashmap)。

这样,在提交拓扑以便在Storm群集上执行之后,您可以轮询持久存储以获取新ID,并为每个新ID执行DRPC请求。

原始答案

我认为我不明白这个问题。您是否尝试使用从同一DRPC拓扑的spout输出中获取的请求ID参数来执行Storm DRPC请求?我不认为这是DRPC拓扑的有效和有意使用。您最好使用普通拓扑。

DRPC拓扑用于有限计算,而普通拓扑用于连续计算。 DRPC调用接收DRPC拓扑的名称,以及用于计算DRPC调用结果的一组输入参数。普通风暴(或三叉戟)拓扑只是无限期地运行,计算某种结果并坚持它。

我希望这会有所帮助。如果没有,请更好地重新表述你的问题,因为你的问题并不是很清楚。