前提:
在storm集群上完成drpc的配置,即修改storm.yaml文件,添加以下内容:(storm01是storm集群的主节点)
drpc.servers: - "storm01"
启动storm的drpc服务,执行以下命令
storm drpc&
在eclipse中创建maven项目,编写实现DRPC Server的代码
package com.xnmzdx.storm.drpc1.server;
import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.LocalDRPC;
import backtype.storm.StormSubmitter;
import backtype.storm.drpc.LinearDRPCTopologyBuilder;
import backtype.storm.generated.AlreadyAliveException;
import backtype.storm.generated.InvalidTopologyException;
import backtype.storm.topology.BasicOutputCollector;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseBasicBolt;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;
public class BasicDRPCTopology {
public static class ExclaimBolt extends BaseBasicBolt{
private static final long serialVersionUID = 1L;
public void execute(Tuple input, BasicOutputCollector collector) {
String value = input.getString(1);//这里取得的就是客户端传进来的client.execute("exclamation", word)中的word的值
collector.emit(new Values(input.getValue(0),value + "!"));//input.getValue(0)得到的可能是tuple的序号之类的,
}
public void declareOutputFields(OutputFieldsDeclarer declarer) {
declarer.declare(new Fields("id","result"));
}
}
public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException {
//创建drpc实例,定义功能名称为exclamation
LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("exclamation");
//添加bolt
builder.addBolt(new ExclaimBolt(),3);
Config conf = new Config();
if(args == null || args.length == 0) { //如果没有传入参数,则运行本地模式
LocalDRPC drpc = new LocalDRPC();
LocalCluster cluster = new LocalCluster();
cluster.submitTopology("drpc-demo", conf, builder.createLocalTopology(drpc));
for(String word : new String[] {"hello","goodbye"}) {
System.out.println("Result for \""+word+"\":"+drpc.execute("exclamation", word));
}
cluster.shutdown();
drpc.shutdown();
}else {//运行集群模式
conf.setNumWorkers(2);
StormSubmitter.submitTopology(args[0], conf, builder.createRemoteTopology());
}
}
}
编写client的代码,模拟客户端调用刚刚编写的exclamation功能
package com.xnmzdx.storm.drpc1.client;
import org.apache.thrift7.TException;
import backtype.storm.generated.DRPCExecutionException;
import backtype.storm.utils.DRPCClient;
public class ExclamDrpcClient {
public static void main(String[] args) throws TException, DRPCExecutionException {
//创建DRPC客户端
DRPCClient client = new DRPCClient("192.168.213.240", 3772);
System.out.println(client);
for(String word : new String[] {"hello","goodbye"}) {
//"exclamation"是客户端向服务器调用的DPRCTopology的功能名称
System.out.println(client.execute("exclamation", word));//调用集群中的exclamation功能做运算,并获得返回值
}
}
}
注意:先将此项目打成jar包,上传到storm集群上使用以下命令运行起来,然后再运行client端的代码,即ExclamDrpcClient 类
#com.xnmzdx.storm.drpc1.server.BasicDRPCTopology是jar包中需要运行的类的完整名称
storm jar storm04-0.0.1-SNAPSHOT.jar com.xnmzdx.storm.drpc1.server.BasicDRPCTopology 参数1,参数2,....
至此,就模拟使用了storm的drpc功能