Storm的分布式的远程方法调用(DRPC)

一、DRPC就是分布式的远程方法调用。
在Storm里面引入DRPC主要是利用storm的实时计算能力来并行化CPU密集型的计算任务,DRPC的storm topology以函数的参数流作为数据,而把这些函数调用的返回值作为topology的输出流
DRPC其实不能算是storm本身的特性,他是通过组合storm的stream、spout、bolt、topology而成的一种模式,本来应该把DRPC单独打成一个包,但是DRPC实在是太有用了,所以我们把他和storm捆绑在一起
DRPC是通过一个‘DRPC Server’来实现
DRPC Server的整体工作过程如下:
1、接收一个RPC请求
2、发送请求到storm topology
3、从storm topology 接收结果
4、把结果返回给等待的客户端
下面例子我只用到了2个类:
由于我们使用DRPC的输入流作为参数,也就是不需要编写spout类,这里直接把bolts作为静态内部类写到BasicDRPCTopology里面
package hello.drpc1;

import backtype.storm.Config;
import backtype.storm.LocalCluster;
import backtype.storm.LocalDRPC;
import backtype.storm.StormSubmitter;
import backtype.storm.drpc.LinearDRPCTopologyBuilder;
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 {
		@Override
	    public void execute(Tuple tuple, BasicOutputCollector collector) {
	      String input = tuple.getString(1);
	      //System.out.println("==========" + tuple.getValue(0));
	      collector.emit(new Values(tuple.getValue(0), input + "!"));
	    }

	    @Override
	    public void declareOutputFields(OutputFieldsDeclarer declarer) {
	      declarer.declare(new Fields("id", "result"));
	    }
    }

	  public static void main(String[] args) throws Exception {
		  	//创建drpc实例
		    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(3);
			      StormSubmitter.submitTopology(args[0], conf, builder.createRemoteTopology());
		    }
	  }
}

再写一个远程调用方法:

package hello.drpc1;

import backtype.storm.utils.DRPCClient;

public class DrpcExclam {

	public static void main(String[] args) throws Exception {
		DRPCClient client = new DRPCClient("192.168.100.240", 3772);
	      for (String word : new String[]{ "test1", "test2" }) {
	    	  System.out.println(client.execute("exclamation", word));
	      }
	}
}

这样我的代码就写完了。现在我们需要对环境做一些修改。

实现DRPC步骤(
1、需要修改配置文件内容为(分别修改每台机器配置):
   vim /user/local/apache-storm-0.9.2/conf/storm.yaml
    drpc.servers:
               -'192.168.100.240'

2、需要启动storm的drpc服务(192.168.100.240启动):
 storm drpc &

3、把相应的topology上传到storm服务器上去
如下图所示


用命令启动集群模式
storm jar storm04.jar hello.drpc1.BasicDRPCTopology exc
4、在本地调用远程topology(这里我们可以想象test1、test2是一个非常庞大的数据流,我们可以使用这种DPRC的方式直接调用,这样就非常方便了)






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值