目录
1.Hadoop RPC对外提供接口(见类org.apache.hadoop.ipc.RPC)
一、RPC
1.概念
RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC Client: RPC协议的调用方。
RPC Server:远程方法的提供方。
RPC Proxy/Stub:存在于客户端,因为RPC协议的”透明性”,需要存在一个Stub层封装RPC远程调用的过程实现,让客户端觉得是在本地调用方法一样。
RPC Processor/Selector:存在于服务端,由于服务器端某一个RPC接口的实现的特性(它并不知道自己是一个将要被RPC提供给第三方系统调用的服务),所以在RPC框架中应该有一种“负责执行RPC接口实现”的角色。它负责了包括:管理RPC接口的注册、判断客户端的请求权限、控制接口实现类的执行在内的各种工作。
MessageProtocol:由于一次交互都有服务端和客户端两端都能识别的,共同约定的格式。消息管理层负责对消息的编码和解码。同时要保证消息序列化的高效性。
Transfer/Network:负责管理RPC框架所使用的网络协议、网络IO模型。
IDL:接口定义语言,为跨语言的特性设计的通用的消息格式。
2.特点
(1)透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样;
(2)高性能:RPC Server能够并发处理多个来自Client的请求;
(3)可控性:jdk中已经提供了一个RPC框架—RMI,但是该PRC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的PRC框架。
Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等
二、Hadoop中RPC机制
Hadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯全靠它了。例如:我们平时操作HDFS的时候,使用的是FileSystem类,它的内部有个DFSClient对象,这个对象负责与NameNode打交道。在运行时DFSClient在本地创建一个NameNode的代理,然后就操作这个代理,这个代理就会通过网络,远程调用到NameNode的方法,也能返回值。
1.Hadoop RPC对外提供接口(见类org.apache.hadoop.ipc.RPC)
(1)public static <T> ProtocolProxy <T> getProxy/waitForProxy(…)
构造一个客户端代理对象(该对象实现了某个协议),用于向服务器发送RPC请求
(2)public static Server RPC.Builder (Configuration).build()
为某个协议(实际上是Java接口)实例构造一个服务器对象,用于处理客户端发送的请求
2.简单应用
(1)定义接口SomeServiceI
public interface SomeServiceI {
public static final long versionID = 1234L;//该字段必须要有,不然会报java.lang.NoSuchFieldException: versionID异常
public String doSomething(String str);
}
(2)定义接口实现类SomeServiceImpl
public class SomeServiceImpl implements SomeServiceI{
@Override
public String doSomething(String str) {
return str;
}
}
(3)服务器端RPCServer
绑定被调用的对象,实例,地址,端口
public class RPCServer {
public static void main(String[] args) throws Exception {
Server server = new RPC.Builder(new Configuration())
.setProtocol(SomeServiceI.class)
.setInstance(new SomeServiceImpl())
.setBindAddress("192.168.2.100")
.setPort(10000)
.build();
server.start();
}
}
(4)客户端RPCClient
public class RPCClient {
public static void main(String[] args) throws Exception {
MyBizable proxy = RPC.getProxy(SomeServiceI.class, 1234L,new InetSocketAddress("192.168.2.100", 10000) , new Configuration());
String result = proxy.doSomething("服务端");
System.out.println(result);
RPC.stopProxy(proxy);
}