Hadoop的RPC机制及简单实现
1.RPC简介
Remote Procedure Call 远程过程调用协议
RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
hadoop的整个体系结构就是构建在RPC之上的(见org.apache.hadoop.ipc)
RPC类似于webservice,将服务发布为一个service。RPC与hadoop没有关系,如果需要我们可以在普通的项目中使用RPC机制,RPC存在commons包中。
2.首先了解Socket通信过程:(以webservice为例)
3.RPC机制(以登录为例介绍)
用到的技术:动态代理+反射+socket通信
4.RPC的例子,按照上面的思路实现登录
登录的Service部署在linux虚拟机中,以服务的形式发布(RPC发布),登录的Controller在windows中生成代理对象然后进行登录。
1.Linux中利用RPC机制发布server(发布service作为server)
LoginService .java (需要定义一个Long型的版本号)
- package cn.qlq.rpc;
- import java.sql.SQLException;
- public interface LoginService {
- /**
- * service's verionID
- */
- public static final long versionID=1L;
- /**
- * login method
- * @param username
- * @param password
- * @return
- * @throws SQLException
- */
- public abstract String login(String username,String password)throws SQLException;
- }
LoginServiceImpl .java 实现类
- package cn.qlq.rpc;
- import java.sql.SQLException;
- public class LoginServiceImpl implements LoginService {
- @Override
- public String login(String username, String password) throws SQLException {
- // TODO Auto-generated method stub
- return username+" logged successfully ";
- }
- }
发布一个service作为server的类。
1.创建builder
2.绑定地址,端口,需要发布的类的接口,类的实例对象
3.用builder.build()获取server
4.用server.start()发布server
- package cn.qlq.rpc;
- import java.io.IOException;
- import org.apache.hadoop.HadoopIllegalArgumentException;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.ipc.RPC;
- import org.apache.hadoop.ipc.RPC.Builder;
- import org.apache.hadoop.ipc.Server;
- /**
- * publish loginService
- *
- * @author root
- *
- */
- public class Publisher {
- public static void main(String[] a) throws HadoopIllegalArgumentException, IOException {
- Builder builder = new RPC.Builder(new Configuration());
- builder.setBindAddress("192.168.2.130").setPort(888).setProtocol(LoginService.class)
- .setInstance(new LoginServiceImpl());
- // create server and publish service
- Server server = builder.build();
- server.start();
- }
- }
2.Windows利用RPC机制生成代理对象然后访问上面发布的server
1.需要将接口复制到windows中;(注意,这里的LoginService 接口所在包必须与linux中一样,否则会报协议异常)
- package cn.qlq.rpc;
- import java.sql.SQLException;
- /**
- * 登录的Service接口
- * @author liqiang
- *
- */
- public interface LoginService {
- /**
- * service's verionID
- */
- public static final long versionID=1L;
- /**
- * login method
- * @param username
- * @param password
- * @return
- * @throws SQLException
- */
- public abstract String login(String username,String password)throws SQLException;
- }
2.生成代理对象,访问server进行登录:
- package cn.qlq.rpc;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import java.sql.SQLException;
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.ipc.RPC;
- /**
- * 登录的controller,调用hadoop的RPC生成代理对象然后访问server
- *
- * @author liqiang
- *
- */
- public class LoginController {
- public static void main(String[] args) throws IOException, SQLException {
- //1.生成代理对象
- LoginService proxy = RPC.getProxy(LoginService.class, 1L, new InetSocketAddress("192.168.2.130", 10000),new Configuration());
- //2.访问server
- String result = proxy.login("meinv", "111111");
- System.out.println(result);
- }
- }
结果:
- meinv logged successfully
注意:发布server的接扣的包必须与调用的接口所在包一样,否则会报未知协议异常。
总结:
RPC机制就像webservice一样,使得程序可以运行在不同的主机上,通过socket调用,RPC更简单。发布服务与调用服务都被封装为方法。
这样做的好处就是当我们修改了实现登录方法的代码之后不需要重新部署客户端代码,实现和接口分离。
我们也可以在普通的web项目中利用此机制,发布server实现功能共享。
Hadoop的RPC机制及简单实现的更多相关文章
- hadoop的RPC机制 -源码分析
这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试.面试,以至于对hadoop RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上 ...
- Hadoop的RPC机制源码分析
分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://www.cnblogs.com/sh425/p/6893662.html )2. ...
- 源码级强力分析hadoop的RPC机制
分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://weixiaolu.iteye.com/blog/1477774 )2. Java ...
- 【Hadoop】HDFS笔记(一):Hadoop的RPC机制
RPC(Remote Procedure Call, 远程过程调用)主要面对两个问题: 1.对象调用方式: 2.序列/反序列化机制. Hadoop实现的RPC组件依赖于Hadoop Writable类 ...
- Hadoop学习笔记—3.Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- 每天收获一点点------Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop中的RPC机制
1. RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI ...
- Hadoop RPC机制详解
网络通信模块是分布式系统中最底层的模块,他直接支撑了上层分布式环境下复杂的进程间通信逻辑,是所有分布式系统的基础.远程过程调用(RPC)是一种常用的分布式网络通信协议,他允许运行于一台计算机的程序调用 ...
随机推荐
- Dapper 介绍
转载:http://***/html/itweb/20130918/125194_125199_125210.htm .NET 轻量级 ORM 框架 - Dapper 介绍 Dapper简单介绍: D ...
- day24 包
# 把解决一类问题的模块会被放在一个文件夹里面,即包 # import os # os.makedirs('glance/api') # os.makedirs('glance/cmd') # os. ...
- day22 collection 模块 (顺便对比queue也学习了一下队列)
collection 定义命名元祖,让元祖的每个元素可以通过类似对象属性的方法用".属性"及其方便的取值. 定义可前后拿取值且可迭代的双端队列 定义有顺序的字典 定义有默认值的字典 ...
- IDEA上传码云报错Push rejected: Push to origin/master was rejected
原因是README.md文件冲突,码云上在创建项目的时候不要初始化README.md,然后再用IDEA上传
- Intent 传递数据
使用INtent 在页面之间跳转,数据传递是必须的,我们可以直接在intent 对象上放置基本数据类型的数据,也可以放置字符串和其他数据类型数据.对于其他数据类型,实现了Parcelable 或Ser ...
- Internet Explorer 10 administration IE10管理
http://4sysops.com/archives/internet-explorer-10-administration-part-1-overview/ http://4sysops.com/ ...
- 洛谷 P4074 [WC2013]糖果公园 解题报告
P4074 [WC2013]糖果公园 糖果公园 树上待修莫队 注意一个思想,dfn序处理链的方法,必须可以根据类似异或的东西,然后根据lca分两种情况讨论 注意细节 Code: #include &l ...
- hdu3516 Tree Construction (区间dp+四边形优化)
构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...
- luogu P4198 楼房重建——线段树
题目大意: 小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度.如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有与之前的线 ...
- 应用程序发生异常 unknown software exception (0xc00000fd)... - 栈溢出(Stack overflow)
今天在写程序的时候,弹出这样的提示对话框: 应用程序发生异常 unknown software exception (0xc00000fd): 相关代码是这样,在一个函数中读取一个csv文件,先根据这 ...