Twitter Storm: DRPC学习

本文介绍如何使用 Apache Storm 的 Distributed RPC (DRPC) 功能实现并行化 CPU 密集型计算任务。通过示例代码展示了如何构建一个简单的 DRPC 拓扑结构,包括 ExclaimBolt 类的具体实现细节及其测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习途径

作者:  xumingming | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明
网址:  http://xumingming.sinaapp.com/756/twitter-storm-drpc/

 

本文翻译自:https://github.com/nathanmarz/storm/wiki/Distributed-RPC

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

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

DRPC例子

新建一个Bolat作为数据处理
[java]  view plain copy
  1. /** 
  2.  * ExclaimBolt.java 
  3.  * 版权所有(C) 2013  
  4.  * 创建:cuiran 2013-01-15 17:26:42 
  5.  */  
  6. package com.stormdemo.drpc;  
  7.   
  8. import java.util.Map;  
  9.   
  10. import org.apache.commons.logging.Log;  
  11. import org.apache.commons.logging.LogFactory;  
  12.   
  13. import com.stormdemo.demo.DemoTopology;  
  14.   
  15. import junit.framework.TestCase;  
  16.   
  17. import backtype.storm.drpc.LinearDRPCTopologyBuilder;  
  18. import backtype.storm.task.TopologyContext;  
  19. import backtype.storm.topology.BasicOutputCollector;  
  20. import backtype.storm.topology.IBasicBolt;  
  21. import backtype.storm.topology.OutputFieldsDeclarer;  
  22. import backtype.storm.tuple.Fields;  
  23. import backtype.storm.tuple.Tuple;  
  24. import backtype.storm.tuple.Values;  
  25.   
  26. /** 
  27.  * TODO 
  28.  * @author cuiran 
  29.  * @version TODO 
  30.  */  
  31. public class ExclaimBolt   implements IBasicBolt {  
  32.     private static Log log = LogFactory.getLog(ExclaimBolt.class.getName());  
  33.       
  34.     /* (non-Javadoc) 
  35.      * @see backtype.storm.topology.IBasicBolt#cleanup() 
  36.      */  
  37.     @Override  
  38.     public void cleanup() {  
  39.         // TODO Auto-generated method stub  
  40.   
  41.     }  
  42.   
  43.     /* (non-Javadoc) 
  44.      * @see backtype.storm.topology.IBasicBolt#execute(backtype.storm.tuple.Tuple, backtype.storm.topology.BasicOutputCollector) 
  45.      */  
  46.     @Override  
  47.     public void execute(Tuple tuple, BasicOutputCollector collector) {  
  48.         // TODO Auto-generated method stub  
  49.         log.debug("处理数据");  
  50.         String input = tuple.getString(1);        
  51.         log.debug("接收到的数据为:"+input);  
  52.         collector.emit(new Values(tuple.getValue(0), input + "!"));   
  53.     }  
  54.   
  55.     /* (non-Javadoc) 
  56.      * @see backtype.storm.topology.IBasicBolt#prepare(java.util.Map, backtype.storm.task.TopologyContext) 
  57.      */  
  58.     @Override  
  59.     public void prepare(Map stormConf, TopologyContext context) {  
  60.         // TODO Auto-generated method stub  
  61.   
  62.     }  
  63.   
  64.     /* (non-Javadoc) 
  65.      * @see backtype.storm.topology.IComponent#declareOutputFields(backtype.storm.topology.OutputFieldsDeclarer) 
  66.      */  
  67.     @Override  
  68.     public void declareOutputFields(OutputFieldsDeclarer declarer) {  
  69.         // TODO Auto-generated method stub  
  70.          declarer.declare(new Fields("id""result"));   
  71.     }  
  72.   
  73.     /* (non-Javadoc) 
  74.      * @see backtype.storm.topology.IComponent#getComponentConfiguration() 
  75.      */  
  76.     @Override  
  77.     public Map<String, Object> getComponentConfiguration() {  
  78.         // TODO Auto-generated method stub  
  79.         return null;  
  80.     }  
  81.   
  82.       
  83.       
  84.       
  85. }  

然后写一个测试类
[java]  view plain copy
  1. /** 
  2.  * DRPCTest.java 
  3.  * 版权所有(C) 2013  
  4.  * 创建:cuiran 2013-01-15 17:25:37 
  5.  */  
  6. package com.stormdemo.drpc;  
  7.   
  8. import org.apache.commons.logging.Log;  
  9. import org.apache.commons.logging.LogFactory;  
  10.   
  11. import backtype.storm.Config;  
  12. import backtype.storm.LocalCluster;  
  13. import backtype.storm.LocalDRPC;  
  14. import backtype.storm.drpc.LinearDRPCTopologyBuilder;  
  15. import backtype.storm.topology.TopologyBuilder;  
  16. import junit.framework.TestCase;  
  17.   
  18. /** 
  19.  * TODO 
  20.  * @author cuiran 
  21.  * @version TODO 
  22.  */  
  23. public class DRPCTest extends TestCase {  
  24.       
  25.     private static Log log = LogFactory.getLog(DRPCTest.class.getName());  
  26.       
  27.   
  28.     public void testDrpc(){  
  29.         log.debug("testDrpc开始");  
  30.         Config conf = new Config();  
  31.         conf.setDebug(true);  
  32.         conf.setNumWorkers(2);  
  33.         conf.setMaxSpoutPending(1);  
  34.         LocalDRPC drpc=new LocalDRPC();  
  35.         LocalCluster cluster=new LocalCluster();  
  36.         LinearDRPCTopologyBuilder builder  = new LinearDRPCTopologyBuilder("exclamation");   
  37.         builder.addBolt(new ExclaimBolt(), 3);   
  38.           
  39.         cluster.submitTopology("DRPCTest", conf, builder.createLocalTopology(drpc));  
  40.           
  41.         log.debug("传入参数返回的结果:"+drpc.execute("exclamation""hello"));  
  42.           
  43.           
  44.         cluster.shutdown();  
  45.         drpc.shutdown();  
  46.     }  
  47. }  
运行结果如图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值