1、基本概念
Storm DRPC中,接收用户操作请求的是DRPCSpout,把接收到的用户请求交给Bolt去执行。这里的Bolt是我们用户需要写代码实现的。Bolt计算完成之后,把结果发射出去,给ReturnResults bolt。该bolt负责把结果送给server
storm中的DRPC提供了集群中处理功能的访问接口。相当于集群向外暴露一个功能接口,用户可以在任何地方进行调用。
LinearDRPCTopologyBuilder已过时,被trident取代
实现DRPC流程图:
1、代码方式演示drpc远程过程调用
1.1 集群模式开启DRPC服务
——修改storm/conf/storm.yaml 把drpc.servers的值改为192.168.2.33
——
在192.168.3.33执行storm/bin/storm drpc启动drpc server
——拷贝storm.yaml到其它节点上
scp storm.yaml hadoop@cloud05:/home/hadoop/app/storm-0.9.3/conf/
scp storm.yaml hadoop@cloud06:/home/hadoop/app/storm-0.9.3/conf/
scp storm.yaml hadoop@cloud07:/home/hadoop/app/storm-0.9.3/conf/
1.2 编写DRPC的服务端和客户端
/**
* DRPC客户端
* @author shenfl
*
*/
public class DRPCRemoteClient {
public static void main(String[] args) {
DRPCClient client = new DRPCClient("192.168.2.33", 3772);
try {
String rs = client.execute( "hello", "world");
System. out.println("客户端调用结果: "+rs);
} catch (TException e ) {
e.printStackTrace();
} catch (DRPCExecutionException e ) {
e.printStackTrace();
}
}
}
/**
* DRPC服务端
*
* @author shenfl
*
*/
public class DRPCRemoteTopology {
/**
* 用户自定义bolt
*/
public static class MyBolt extends BaseRichBolt {
private OutputCollector collector ;
public void prepare(Map stormConf, TopologyContext context, OutputCollector collector ) {
this.collector = collector ;
}
/**
* 传递过来的tuple有2个元素,第一个函数信息,第二个参数信息
*/
public void execute(Tuple input) {
String info = input.getString(1);
this.collector .emit(new Values(input.getValue(0), "hello " + "\t" + info ));
}
public void declareOutputFields(OutputFieldsDeclarer declarer ) {
declarer.declare( new Fields("funcName" , "info"));
}
}
/**
* 服务端的主线程类
*
* @param args
*/
public static void main(String[] args) {
LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("hello") ;
builder. addBolt(new MyBolt()) ;
try {
/*if(args.length==0){//本地模式运行
LocalCluster localCluster = new LocalCluster();
ILocalDRPC drpcServer = new LocalDRPC() ;
localCluster.submitTopology("drpcLocalTopology",new Config(), builder.createLocalTopology(drpcServer));
String rs = drpcServer.execute("hello", "world");
System.out.println("客户端调用结果: "+ rs);
}else{
//集群模式
StormSubmitter.submitTopology(DRPCRemoteTopology.class.getSimpleName(), new Config(),
builder.createRemoteTopology());
}*/
//集群模式
StormSubmitter. submitTopology(DRPCRemoteTopology. class.getSimpleName(), new Config(),
builder. createRemoteTopology());
} catch (Exception e ) {
e.printStackTrace();
}
}
}
1.3 启动服务端
[hadoop@cloud03 ~]$ storm jar stormdrpc.jar storm.drpc.DRPCRemoteTopology
1.4 客户端验证