storm drpc分布式本地和远程调用模式讲解
一.drpc 的介绍
1.rpc
RPC(Remote Procedure Call)—远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
2.drpc
drpc(Distributed Remote Procedure Call) - 分布式的远程过程调用。
我们回顾一下前面学习的storm知识,知道storm是一个分布式的流式计算框架,由1台nimbus 和多台supervisor 组成,nimbus主要是把任务分发到不同的supervisor 上,而supervisor是分布在不同节点上的。在一个完整的topology中,spout是用来收集上游jobs的,然后再由nimbus负责分发给相应的supervisor,然后由worker来执行jobs,而drcp的调用是当我们想调用这个topology中的函数时,直接通过调用supervisorr上的worker就行,然后由worker线程来执行调用的过程。
个人理解是:storm的drcp就是满足用户直接调用这个topology处理信息的,以前的可能是固定的收集数据,现在需要时,可以随时调用
二.drcp的调用
1.本地的调用
- public class HelloDRPC {
- private static final Logger LOG = LoggerFactory.getLogger(HelloDRPC.class);
- public static void main(String[] args) throws AlreadyAliveException, InvalidTopologyException, AuthorizationException {
- boolean isRemote = !(args.length == 0);
- LinearDRPCTopologyBuilder builder = new LinearDRPCTopologyBuilder("echo");
- builder.addBolt(new EchoBolt(),1);// 第2个参数是:并行度
- Config conf = new Config();
- conf.setDebug(false);
- conf.setNumWorkers(2);
- if(isRemote){
- StormSubmitter.submitTopology("HelloDRPC", conf, builder.createRemoteTopology());
- LOG.warn("==================================================");
- LOG.warn("the topology {} is submitted.","HelloDRPC");
- LOG.warn("==================================================");
- }else{
- LocalDRPC drpc = new LocalDRPC();
- LocalCluster cluster = new LocalCluster();
- cluster.submitTopology("HelloDRPC", conf, builder.createLocalTopology(drpc));
- Arrays.asList("hello","world","storm","java","kafka").forEach(
- item ->
- {
- String result = drpc.execute("echo",item );
- LOG.warn(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
- LOG.warn(">>>>>>>>>>>>>>> result:{}",result);
- LOG.warn(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ");
- }
- );
- }
- }
- public static class EchoBolt extends BaseBasicBolt{
- @Override
- public void execute(Tuple input, BasicOutputCollector collector) {
- LOG.warn(" ================> tuple:{}",input.getFields());
- Object id = input.getValue(0);
- String name = input.getString(1);
- System.err.println("------------------------------");
- System.err.println("id: "+id +" name: "+ name);
- System.err.println("------------------------------");
- collector.emit(new Values(id,"echo: "+ name));
- }
- @Override
- public void declareOutputFields(OutputFieldsDeclarer declarer) {
- declarer.declare(new Fields("id","value"));
- }
- }
- }
//在无参情况下,直接运行 会将数据全部发出
2.远程过程调用
远程过程调用是将drcp当作一个服务端,然后由client去连接调用。
1.drcp的配置
- drpc.servers:
- - "master"
- drpc.port: 3777
- storm.thrift.transport: "org.apache.storm.security.auth.plain.PlainSaslTransportPlugin"
- 本测试共3台虚拟机,1台nimbus 2台supervisor 在3台storm.yaml 分别配置以上内容,然后启动3台drcp服务
storm drpc & #后台启动
2.启动服务端
将HelloDRPC 当作服务端,打成jar包,然后启动
- storm jar storm_test-0.0.1-SNAPSHOT.jar com.drpc.HelloDRPC 1
3.客户端连接
- public class HelloClientDRPC {
- private static final Logger LOG = LoggerFactory.getLogger(HelloClientDRPC.class);
- public static void main(String[] args) throws DRPCExecutionException, AuthorizationException, TException {
- Config conf = new Config();
- conf.put("storm.thrift.transport", "org.apache.storm.security.auth.plain.PlainSaslTransportPlugin");
- conf.put(Config.STORM_NIMBUS_RETRY_TIMES, 3);
- conf.put(Config.STORM_NIMBUS_RETRY_INTERVAL, 10);
- conf.put(Config.STORM_NIMBUS_RETRY_INTERVAL_CEILING, 20);
- DRPCClient client = new DRPCClient(conf, "master", 3777);
- String result = client.execute("echo", "hello");
- System.out.println("result:"+result);
- LOG.info("=====================================> "+ result);
- }
- }
- //结果正常返回
storm drpc分布式本地和远程调用模式讲解的更多相关文章
- JavaEE(8) - 本地和远程调用的有状态以及无状态Session EJB
1. 使用NetBeans开发Session Bean #1. 创建项目:File-->New Project-->Java EE-->EJB Module #2. 在项目中创建Se ...
- java RMI 远程调用
1.背景 在学习代理模式的过程中接触到了远程调用,jdk有自己的RMI实现,所以这边自己实现了RMI远程调用,并记录下心得. 感受最深的是RMI和现在的微服务有点相似,都是通过"注册中心&q ...
- .net的远程调用
.Net远程调用(转自:http://www.cnblogs.com/omilan/articles/3191378.html) 看到了这.net远程调用的讲解,觉得不错,拿来分享!! .Net对于远 ...
- dotNET使用DRPC远程调用运行在Storm上的Topology
Distributed RPC(DRPC)是Storm构建在Thrift协议上的RPC的实现,DRPC使得你可以通过多种语言远程的使用Storm集群的计算能力.DRPC并非Storm的基础特性,但它确 ...
- Java[2] 分布式服务架构之java远程调用技术浅析(转http://www.uml.org.cn/zjjs/201208011.asp)
转自:http://www.uml.org.cn/zjjs/201208011.asp 在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如: ...
- Atitit.分布式远程调用 rpc rmi CORBA的关系
Atitit.分布式远程调用 rpc rmi CORBA的关系 1. 远程调用(包括rpc,rmi,rest)1 2. 分布式调用大体上就分为两类,RPC式的,REST式的1 3. RPC(远程 ...
- 分布式远程调用SpringCloud-Feign的两种具体操作方式(精华)
一 前言 几大RPC框架介绍 1.支持多语言的RPC框架,google的gRPC,Apache(facebook)的Thrift 2.只支持特定语言的RPC框架,例如新浪的Motan 3.支持服务治理 ...
- spring代理模式 service远程调用,插件执行
最近,研究了一下平台远程调用的过程,和service层插件执行的原理,记录一下. 1.远程service调用过程 首先看一下类的继承结构 封装调用处理过程 封装service调用接口 封装servic ...
- openoffice excel word 转换pdf 支持本地调用和远程调用
OpenOffice.org 是一套跨平台的办公室软件套件,能在Windows.Linux.MacOS X (X11)和 Solaris 等操作系统上执行.它与各个主要的办公室软件套件兼容.OpenO ...
随机推荐
- 018_查看有多少远程的 IP 在连接本机(不管是通过 ssh 还是 web 还是 ftp 都统计)
#!/bin/bash#使用 netstat -atn 可以查看本机所有连接的状态,-a 查看所有,-t 仅显示 tcp 连接的信息,-n 数字格式显示# Local Address(第四列是本机的 ...
- python 比较运算符
x == y x < y x <= y x >= y x != y x is y x is not y x in y x not in y >>> "f ...
- 创建全局变量用以保存传递MFC中不同窗口中的数据
格式如下: //DATA_TEMP.h class CDATA_TEMP{public: CDATA_TEMP(); virtual ~CDATA_TEMP();public: static int ...
- 解决Virtualbox的根分区容量不够用问题
现在Virtualbox新建一块磁盘.容量一定要比原来的大.然后执行克隆命令. 把原来的磁盘内容克隆到新磁盘上.然后重新启动电脑. 运行相关扩容命令即可. #克隆磁盘 cd C:\Program Fi ...
- Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...
- oracle last_value使用过程中的一个细节
测试结果集:select role_id,update_date from user_info where role_id='6505007898843021313' 使用last_value求出当前 ...
- nodejs 服务器模拟异常状态码429,以及前端vue axios捕获状态码
nodejs 服务端发送429状态: extendInfo (req, res) { res.status(429).json('Too many requests, please try again ...
- TypeError: Data location must be "memory" for return parameter in function, but none was given.
在用truffle编译智能合约时,报错 TypeError: Data location must be "memory" for return parameter in fu ...
- Wamp win10 1077error
检查日志发现了1077错误 State of services: The service 'wampapache64' is NOT started EXIT error code:1077 He ...
- [oracle]TX行锁发生的常见场景(转贴)
TX行锁发生的常见场景: 1.当前会话要更新或删除的记录,已经被其他会话更新或删除. 2.对于表上有唯一索引的情况,多个会话插入或更新为相同的键值. 3.对于表上有位图索引的情况,多个会话即使更新不同 ...