一、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机制的更多相关文章

  1. Hadoop学习笔记—3.Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  2. Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  3. 理解Android系统的进程间通信原理(二)----RPC机制

    理解Android系统中的轻量级解决方案RPC的原理,需要先回顾一下JAVA中的RMI(Remote Method Invocation)这个易于使用的纯JAVA方案(用来实现分布式应用).有关RMI ...

  4. 每天收获一点点------Hadoop RPC机制的使用

    一.RPC基础概念 1.1 RPC的基础概念 RPC,即Remote Procdure Call,中文名:远程过程调用: (1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网 ...

  5. Hadoop的RPC机制及简单实现

    1.RPC简介 Remote Procedure Call 远程过程调用协议 RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些 ...

  6. Hadoop2源码分析-RPC机制初识

    1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...

  7. hadoop的RPC机制 -源码分析

    这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试.面试,以至于对hadoop RPC(Remote Procedure Call Protocol ,远程过程调用协议,它是一种通过网络从远程计算机程序上 ...

  8. Hadoop中的RPC机制

    1.  RPC——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据.在OSI ...

  9. Hadoop的RPC机制源码分析

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://www.cnblogs.com/sh425/p/6893662.html )2. ...

  10. 源码级强力分析hadoop的RPC机制

    分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://weixiaolu.iteye.com/blog/1477774 )2. Java ...

随机推荐

  1. MySQL——保证数据的完整性

    为了防止垃圾的产生,从而影响数据库的执行效率. 1实体完整性——行数据的有效性   唯一约束(unique).主键约束(primary key) 2域完整性——列数据的有效性 非空约束(not nul ...

  2. ansible-playbook

    一.ansible-playbook介绍: playbook是由一个或多个"play"组成的列表.play的主要功能在于将事先归为一组的主机装扮成事先通过ansible中的task ...

  3. 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案

    方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...

  4. 解决Tomcat数据连接池无法释放

    近段时间,公司的检测中心报表系统(SMC)的开发人员时不时找到我,说用户老是出现无法登录的情况.前些日子因为手头上 有Jboss集群的测试工作,发现用户不能登录时,都是在Tomcat中将这个项目Rel ...

  5. PHP获取当前服务器信息的基本语句

    下面是PHP获取当前服务器信息的基本语句. PHP程式版本: <?PHP echo PHP_VERSION; ?> ZEND版本: <?PHP echo zend_version() ...

  6. (重要)使用廉价的VPN隐私会被窥探

    使用廉价的VPN可以节省一部分的支出,但是损失的却是我们的网上隐私,很多部门都很关心我们在网上干些什么,本来使用VPN是为了保护自己的隐私不被窥探,很显然这是事与愿违的,一些小公司或者大公司,通过提供 ...

  7. XMLHttpRequest cannot load file:///E:/userdialog.html?_=1465888805734. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-reso

    做前端写静态页面时,采用的是jq easyui框架 在ie与webkit总是加载的时候总是在loading... 而firefox却是正常加载的,总以为是代码写错了, 经过再三的检查以及百度查找,确认 ...

  8. Mono for android 如何动态添加View,线程内部如何更新UI.

    貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...

  9. 用户行为数据采集核心思维(APP、web数据采集/埋点)

    关于数据采集(也就是所谓的埋点),有很多中形式,或者说方法.所有的数据采集都时围绕一个核心的三个点来做区别的处理. 数据采集核心思维三个点: 1.对象: 要采集谁,一个页面.一个按钮,页面或者按钮,就 ...

  10. 广义Euler常数

    对于区间(a,b)内f''(x)>0 那么在该区间内函数的一阶导数对应切线在该区间内只与f(x)在切点相交 1. f''(x)>0那么可知 f'(x)在该区间内是单调增的 以下图为例,过( ...