【第22期】观点:IT 行业加班,到底有没有价值?

Storm DRPC 介绍

转载 2015年07月07日 17:45:59

问题导读:
1.DRPC的作用是什么?
2.DRPC工作流是怎样的?
3.DRPC分为几部分?
4.服务端有几部分组成?



1. DRPC介绍
1.Storm是一个分布式实时处理框架,它支持以DRPC方式调用.可以理解为Storm是一个集群,DRPC提供了集群中处理功能的访问接口.

其实即使不通过DRPC,而是通过在Topoloye中的spout中建立一个TCP/HTTP监听来接收数据,在最后一个Bolt中将数据发送到指定位置也是可以的。这是后话,后面再进行介绍。而DPRC则是Storm提供的一套开发组建,使用DRPC可以极大的简化这一过程。

Storm里面引入DRPC主要是利用storm的实时计算能力来并行化CPU intensive的计算。DRPC的storm topology以函数的参数流作为输入,而把这些函数调用的返回值作为topology的输出流。

DRPC其实不能算是storm本身的一个特性, 它是通过组合storm的原语spout,bolt, topology而成的一种模式(pattern)。本来应该把DRPC单独打成一个包的, 但是DRPC实在是太有用了,所以我们我们把它和storm捆绑在一起。


2.DRPC工作流介绍


Distributed RPC是由一个”DPRC Server”协调的(storm自带了一个实现)。DRPC服务器协调


1) 接收一个RPC请求。
2) 发送请求到storm topology 
3) 从storm topology接收结果。
4) 把结果发回给等待的客户端。


从客户端的角度来看一个DRPC调用跟一个普通的RPC调用没有任何区别。比如下面是客户端如何调用RPC: reach方法的,方法的参数是: http://twitter.com

  1. DRPCClient client = new DRPCClient("drpc-host", 3772);
  2. String result = client.execute("reach","http://twitter.com");
复制代码




DRPC的工作流大致是这样的:

 

客户端给DRPC服务器发送要执行的方法的名字,以及这个方法的参数。实现了这个函数的topology使用DRPCSpout从DRPC服务器接收函数调用流。每个函数调用被DRPC服务器标记了一个唯一的id。 
这个topology然后计算结果,在topology的最后一个叫做ReturnResults的bolt会连接到DRPC服务器,并且把这个调用的结果发送给DRPC服务器(通过那个唯一的id标识)。DRPC服务器用那个唯一id来跟等待的客户端匹配上,唤醒这个客户端并且把结果发送给它。


DRPC包括服务端和客户端两部分

1)服务端
服务端由四部分组成:包括一个DRPC Server, 一个 DPRC Spout,一个Topology和一个ReturnResult。


在实际使用中,主要有三个步骤:

a.启动Storm中的DRPC Server;

   首先,修改Storm/conf/storm.yaml中的drpc server地址;需要注意的是:必须修改所有Nimbus和supervisor上的配置文件,设置drpc server地址。否则在运行过程中可能无法返回结果。

  然后,通过 storm drpc命令启动drpc server。

b.创建一个DRPC 的Topology,提交到storm中运行。

  该Toplogy和普通的Topology稍有不同,可以通过两种方式创建:

  创建方法一:直接使用 Storm 提供的LinearDRPCTopologyBuilder。 (不过该方法在0.82版本中显示为已过期,不建议使用)

                          LinearDRPCTopologyBuilder 可以很方便的创建一个DRPC 的Topology,经过本人测试可以运行,但在使用C++开发的Bolt时有异常,具体问题见:http://blog.csdn.net/jmppok/article/details/16827837

  1. public static class ExclaimBolt extends BaseBasicBolt {
  2.     public void execute(Tuple tuple, BasicOutputCollector collector) {
  3.         String input = tuple.getString(1);
  4.         collector.emit(new Values(tuple.getValue(0), input + "!"));
  5.     }

  6.     public void declareOutputFields(OutputFieldsDeclarer declarer) {
  7.         declarer.declare(new Fields("id", "result"));
  8.     }
  9. }

  10. public static void main(String[] args) throws Exception {
  11.     LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("exclamation");
  12.     builder.addBolt(new ExclaimBolt(), 3);
  13.                     Config conf = new Config();
  14.                 conf.setDebug(true);
  15.                 if (args == null || args.length == 0) {
  16.                         LocalDRPC drpc = new LocalDRPC();
  17.                         LocalCluster cluster = new LocalCluster();

  18.                         cluster.submitTopology("drpc-demo", conf,
  19.                                         builder.createLocalTopology(drpc));

  20.                         for (String word : new String[] { "hello", "goodbye" }) {
  21.                                 System.err.println("Result for "" + word + "": "
  22.                                                 + drpc.execute("exclamation", word));
  23.                         }

  24.                         cluster.shutdown();
  25.                         drpc.shutdown();
  26.                 } else {
  27.                         // conf.setNumWorkers(3);
  28.                         StormSubmitter.submitTopology("exclamation", conf,
  29.                                         builder.createRemoteTopology());
  30.                 }
  31. }
复制代码



创建方法二:

直接使用 Storm 提供的通用TopologyBuilder。 不过需要自己手动加上开始的DRPCSpout和结束的ReturnResults。
其实Storm 提供的LinearDRPCTopologyBuilder也是通过这种封装而来的。

  1.                             TopologyBuilder builder = new TopologyBuilder(); 
  2.                             //开始的Spout
  3.                             DRPCSpout drpcSpout = new DRPCSpout("exclamation");
  4.                             builder.setSpout("drpc-input", drpcSpout,5);
  5.                            
  6.                             //真正处理的Bolt 
  7.                             builder.setBolt("cpp", new CppBolt(), 5)
  8.                                             .noneGrouping("drpc-input");
  9.                            
  10.                             //结束的ReturnResults
  11.                             builder.setBolt("return", new ReturnResults(),5)
  12.                             .noneGrouping("cpp");
  13.             
  14.                             Config conf = new Config();
  15.                             conf.setDebug(false);
  16.                             conf.setMaxTaskParallelism(3);
  17.                             
  18.                             try
  19.                             {
  20.                                     StormSubmitter.submitTopology("exclamation", conf,builder.createTopology());
  21.                             }
  22.                             catch (Exception e)
  23.                             {
  24.                                     e.printStackTrace();
  25.                             }
复制代码



c.通过DRPCClient对Cluster进行访问
需要修改客户端配置文件 ~/.storm/storm.yaml,配置drpc server的地址。修改方法可storm服务端一样。

  1. DRPCClient client = new DRPCClient("10.100.211.232", 3772);
  2. String result = client.execute("exclamation","test");
复制代码

注意如果是本地模式,topology的提交和drpc的访问都有不同。
  1.     LocalDRPC drpc = new LocalDRPC();  
  2.             LocalCluster cluster = new LocalCluster();  
  3.   
  4.             cluster.submitTopology("drpc-demo", conf,  
  5.                     builder.createLocalTopology(drpc));  
  6.                           
  7.   
  8.   
  9.                         // 访问  
  10.                         for (String word : new String[] { "hello", "goodbye" }) {  
  11.                 System.err.println("Result for "" + word + "": "  
  12.                         + drpc.execute("exclamation", word));  
  13.             }  
  14.   
  15.             cluster.shutdown();  
  16.             drpc.shutdown();  
复制代码


2)客户端
客户端在上面服务端中已经介绍了

举报

相关文章推荐

storm drpc学习

storm drpc 是什么?咋一听觉得挺高大上的,其实也就是那么一回事。就是storm的topology 提供了很多函数,并且函数名唯一,函数里面封装了一些算法操作。只需要在调用的时候指定函数名和传...

Storm DRPC 使用

欢迎转载,请注明出处: 1. DRPC介绍 Storm是一个分布式实时处理框架,它支持以DRPC方式调用.可以理解为Storm是一个集群,DRPC提供了集群中处理功能的访问接口. 其实即使不通过...
  • jmppok
  • jmppok
  • 2013-11-20 10:18
  • 10293

storm drpc远程调用

在实际的Storm集群上运行DRPC,需完成以下步骤: 1、配置DRPC Server(s)地址;     在Storm集群中配置DRPC Server地址,这就是DRPCSpout读取函数调用请...

用storm做drpc真的很赞

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://chenlx.blog.51cto.com/4096635/748348 分...

storm DRPC问题

一、配置集群storm.yaml文件,配置drpc.server。 二、开启drpc服务,storm drpc。 三、编写DrpcTopology程序。如下: import org.apache...

storm DRPC例子

1,DRPC原理     客户端给DRPC服务器发送要执行的方法的名字,以及这个方法的参数。实现了这个函数的topology使用DRPCSpout从DRPC服务器接收函 数调用流。每个函数调用被DRP...
  • joeyon
  • joeyon
  • 2015-01-21 08:56
  • 1206

【Storm总结-6】Twitter Storm: DRPC简介

转自:http://xumingming.sinaapp.com/756/twitter-storm-drpc/ ------------------------- Storm里面引入DR...

storm自带例子详解 (二)——BasicDRPCTopology

/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agr...

Storm DRPC 使用

欢迎转载,请注明出处: 1. DRPC介绍 Storm是一个分布式实时处理框架,它支持以DRPC方式调用.可以理解为Storm是一个集群,DRPC提供了集群中处理功能的访问接口. 其实即使不通过...
  • jmppok
  • jmppok
  • 2013-11-20 10:18
  • 10293
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)