strom DRPC服务调用例子
DRPC服务端代码
import java.util.Map;
import backtype.storm.Config;
import backtype.storm.StormSubmitter;
import backtype.storm.drpc.LinearDRPCTopologyBuilder;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.IBasicBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
@SuppressWarnings("deprecation")
public class My_storm_drpc {
public static class storm_drpc_Bolt implements IBasicBolt {
private static final long serialVersionUID = 3812791870691350630L;
StringBuilder Str = new StringBuilder();
public void prepare(Map conf, TopologyContext context) {
}
public void execute(Tuple tuple, BasicOutputCollector collector) {
Str.append("@");
String input = tuple.getString(1);
collector
.emit(new Values(tuple.getValue(0), input + Str.toString()));
}
public void cleanup() {
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("id", "result"));
}
@Override
public Map<String, Object> getComponentConfiguration() {
// TODO Auto-generated method stub
return null;
}
}
@SuppressWarnings("deprecation")
public static void main(String[] args) throws Exception {
LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder(
"My_storm_drpc");
builder.addBolt(new storm_drpc_Bolt(), 3).allGrouping();
Config conf = new Config();
conf.setDebug(false);
conf.setNumWorkers(4);
StormSubmitter.submitTopology(args[0], conf,
builder.createRemoteTopology());
}
}
把代码打包到了一个mystorm.jar的包里
storm测试环境集群只有两台
mynode001 部署了nimbus、zookeeper 以及 drpc server
mynode002 部署了supervisor
storm版本是twitter storm 0.9.0.1最新版
把mystorm.jar copy到mynode001上,
执行以下命令:storm jar /data/storm/storm-yarn-master/lib/mystorm.jar My_storm_drpc My_storm_drpc -c nimbus.host=mynode001
DRPC客户端调用
import backtype.storm.utils.DRPCClient;
public class My_storm_drpc_client {
public static void main(String[] args) throws Exception {
DRPCClient client = null;
client = new DRPCClient("mynode001", 3772);
System.out.println("开始执行DRPC客户端调用");
for (int i = 0; i < 10; i++) {
String tt = client.execute("My_storm_drpc", "你好");
System.out.println("tt = " + tt);
}
}
}
客户机执行以下命令:storm jar /data/storm/storm-yarn-master/lib/mystorm.jar My_storm_drpc_client -c nimbus.host=mynode001
客户端给DRPC服务器发送要执行的方法的名字,以及这个方法的参数。实现了这个函数的topology使用DRPCSpout从DRPC服务器接收函数调用流。每个函数调用被DRPC服务器标记了一个唯一的id。 这个topology然后计算结果,在topology的最后一个叫做ReturnResults的bolt会连接到DRPC服务器,并且把这个调用的结果发送给DRPC服务器(通过那个唯一的id标识)。DRPC服务器用那个唯一id来跟等待的客户端匹配上,唤醒这个客户端并且把结果发送给它。
storm_drpc_Bolt类中的execute方法中参数tuple,第一个field是request-id,第二个field是这个请求的参数。LinearDRPCTopologyBuilder同时要求我们topology的最后一个bolt发射一个二维tuple: 第一个field是request-id, 第二个field是这个函数的结果。最后所有中间tuple的第一个field必须是request-id,和客户端的
request-id匹配,匹配上就传回这个客户端结果。
详细介绍看徐明明介绍:http://xumingming.sinaapp.com/756/twitter-storm-drpc/