Hdoop日记Day10---RPC机制
一、RPC(Remote Procedure Call)简介
RPC 是远程过程调用(Remote Procedure Call),即远程调用其他虚拟机中运行的javaobject。RPC 是一种客户端/服务器模式,那么在使用时包括服务端代码和客户端代码,还有我们调用的远程过程对象。HDFS 的运行就是建立在此基础之上的。本章通过分析实现一个简单的RPC 程序来分析HDFS 的运行机理。
二、代码解析
1. 服务端代码
代码如下:
public class MyServer {
public static final int SERVER_PORT = 12345;
public static final String SERVER_ADDRESS = "localhost";
public static void main(String[] args) throws IOException {
final Server server = RPC.getServer(new MyBiz(), SERVER_ADDRESS,
SERVER_PORT, new Configuration());
7 server.start();
}
}
核心在于第5 行的RPC.getServer 方法,该方法有四个参数:
第一个参数是被调用的java服务对象。
第二个参数是服务器的地址。
第三个参数是服务器的端口。
获得服务器对象后,启动服务器。这样,服务器就在指定端口监听客户端的请求。
2. 被调用的远程对象类
代码如下:
public class MyBiz implements MyBizable{
public static long BIZ_VERSION = 2345234L;
@Override
public String hello(String name){
System.out.println("我被调用了");
return "hello "+name;
}
@Override
public long getProtocolVersion(String protocol, long clientVersion)
throws IOException {
return BIZ_VERSION;
}
}
被调用的远程对象实现了接口MyBizable,这里面有两个方法被实现,一个就是hello方法,另一个是getProtocalVersion 方法。这个hello 方法内部有个输出语句
3. 远程调用类的接口
代码如下:
public interface MyBizable extends VersionedProtocol{
public abstract String hello(String name);
}
这个接口中的方法就是刚才的Biz 中实现的方法。接口继承的VersionedProtocal,是hadoop 的RPC 的接口,所有的RPC 通信必须实现这个一接口,用于保证客户端和服务端的端口一致。服务端被调用的类必须继承这个接口VersionedProtocal。
4. 客户端代码,这里使用的调用对象的接口
代码如下:
public class MyClient {
public static void main(String[] args) throws Exception {
final MyBizable proxy = (MyBizable)RPC.getProxy(MyBizable.class,
4 MyBiz.BIZ_VERSION, new InetSocketAddress(MyServer.SERVER_ADDRESS,
MyServer.SERVER_PORT), new Configuration());
//调用接口中的方法
final String result = proxy.hello("world");
System.out.println(result);
//本质是关闭网络连接
10 RPC.stopProxy(proxy);
}
}
以上代码中核心在于RPC.getProxy(),该方法有四个参数:
第一个参数是被调用的接口类。
第二个是客户端版本号。
第三个是服务端地址。
返回的代理对象,就是服务端对象的代理,内部就是使用java.lang.Proxy 实现的。运行时,先启动服务端,再启动客户端。读者可以在服务端和客户端输出信息。
从上面的RPC 调用中,可以看出:在客户端调用的业务类的方法是定义在业务类的接口中的。该接口实现了VersionedProtocal 接口。
5. 现在我们在命令行执行jps 命令查看输出信息
如图2.1 所示。
图 2.1
可以看到一个java 进程,是“MyServer”,该进程正是我们刚刚运行的rpc 的服务端类MyServer。大家可以联想到我们搭建hadoop 环境时,也执行过该命令用来判断hadoop 的进程是否全部启动。那么可以判断,hadoop 启动时产生的5 个java 进程也应该是RPC 的服务端。我们观察NameNode 的源代码,我们可以看到如图下代码,可以看到NameNode 确实创建了RPC 的服务端。
// create rpc server
InetSocketAddress dnSocketAddr = getServiceRpcServerAddress(conf);
if (dnSocketAddr != null) {
int serviceHandlerCount =
conf.getInt(DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_KEY,
DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_DEFAULT);
this.serviceRpcServer = RPC.getServer(this, dnSocketAddr.getHostName(),
dnSocketAddr.getPort(), serviceHandlerCount,
false, conf, namesystem.getDelegationTokenSecretManager());
this.serviceRPCAddress = this.serviceRpcServer.getListenerAddress();
setRpcServiceServerAddress(conf);
}
Hdoop日记Day10---RPC机制的更多相关文章
- Hadoop学习笔记—3.Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- 理解Android系统的进程间通信原理(二)----RPC机制
理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...
- 每天收获一点点------Hadoop RPC机制的使用
一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...
- Hadoop的RPC机制及简单实现
1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...
- Hadoop2源码分析-RPC机制初识
1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...
- hadoop的RPC机制 -源码分析
这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试.面试,以至于对hadoop RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上 ...
- Hadoop中的RPC机制
1. RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI ...
- 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 ...
随机推荐
- asp.net下AjaxMethod的使用方法
使用AjaxMethod可以在客户端异步调用服务端方法,简单地说就是在JS里调用后台.cs文件里的方法, 做一些JS无法做到的操作,如查询数据库 使用AjaxMethod要满足一下几点: 1.如果还没 ...
- Maven web项目三种运行方式
http://www.micmiu.com/software/build/maven-web-eclipse-deploy/
- android6.0锁屏界面接收新通知处理流程
灭屏状态下,接收新信息,屏幕会半亮显示通知流程: 1,应用构造notification后,传给NotificationManager,而后进入NotificationManagerService处理. ...
- Google高级搜索语法
Google高级搜索语法 Google搜索果真是一个强悍的不得了的搜索引擎,今天转了一些 google的高级搜索语法 希望能帮助到大家. 一.allinanchor: anchor是一处说明性的文 ...
- hdu 1142(DFS+dijkstra)
#include<iostream> #include<cstdio> #include<cmath> #include<map> #include&l ...
- vbox 虚拟机共享文件夹 debian
主机64位windows7 虚拟机Debian 8 64位 注意:在网络更新时,可能需要修改 etc/apt/sources.list 文件,把前几条从CD更新删除掉,这样就会从网络更新 1.vbox ...
- 根据用户IP获得所在城市
运行以下代码即可<html> <head> <meta http-equiv="Content-Type" content="text/ht ...
- Partial backup 备份指定表/库
Partial Backups XtraBackup支持partial backups,这意味着你可以只备份部分表或库.要备份的表必须是独立表空间,即innodb_file_per_table=1 有 ...
- 【Visual Lisp】块专题
;;关于块 ;;(0)模型空间→块表记录→块图元:顶层的是模型空间→模型空间下有很多图元和一些块表记录→块表记录又有很多图元(此时块表记录就相当于模型空间),一个块表记录可以有多个insert块→同一 ...
- [UCSD白板题] Changing Money
Problem Introduction In this problem,you will design an algorithm for changing money optimally. Prob ...