远程过程:java进程.即一个java进程调用另外一个java进程中对象的方法.
调用方称作客户端(client),被调用方称作服务端(server).rpc的通信在java中表现为客户端去调用服务端对象中的方法.RPC通信就是cs结构的通信.client端会知道服务端被调用对象的接口.
RPC是hadoop分布式机制运行的基础.
代码示例:
接口:MyBizable
public interface MyBizable extends VersionedProtocol{ public static final int PORT = 123456 ; public abstract String hello(String name); public abstract long getProtocolVersion(String protocol,long clientVersion)throws IOException; }
接口对应的实现类:MyBiz
public class MyBiz implements MyBizable { @Override public long getProtocolVersion(String protocol, long clientVersion) throws IOException { return MyBizable.PORT; } @Override public String hello(String name) { System.out.println("我被调用了."); return "hello "+ name; } }
服务类:MyServer
public class MyServer { public static final String ADDRESS = "localhost"; public static final int PORT = 2454; public static void main(String[] args) throws Exception{ /** * 构造一个RPC的服务端 * @param instance 实例对象的方法会被客户端调用。 * @param bindAddress 监听绑定的地址 * @param port 监听连接的端口 * @param conf 配置 */ Server server = RPC.getServer(new MyBiz(), MyServer.ADDRESS, MyServer.PORT, new Configuration()); server.start(); } }
客户端:MyClient
public class MyClient { public static void main(String[] args) throws Exception{ MyBizable client =
(MyBizable) RPC.getProxy(MyBizable.class, MyBizable.PORT, new InetSocketAddress(MyServer.ADDRESS,MyServer.PORT), new Configuration()); String result = client.hello("world"); System.out.println(result); } }
客户端与NameNode通信的过程:
NameNode本身就是一个RPC的服务端,主要实现的接口有:ClientProtocol,DatanodeProtocol,NamenodeProtocol
ClientProtocol:是我们客户端(FileSystem)与NameNode通信的接口.
DatanodeProtocol:是DataNode和NameNode通信的接口.
DFSClient:直接调用NameNode接口的对象.
用户代码是通过DistributedFileSystem调用DFSClient对象,才能与NameNode打交道.
我们的RPC客户端实际上是DFSClient,服务端是NameNode.
NameNode为什么要用rpc机制?
RPC是远程过程调用,会起多个java进程,并且之间进行通信的时候用的是Scoket通信,也就意味着RPC通信客户端和服务端不见得是在位于同一台机器上,因为socker通信可以指定ip和端口,意味着我们整个完整的hadoop体系结构是可以分散在多个进程,多个不同的服务器之上的,所以我们的NameNode作为其中的一部分,必然也是需要实现RPC机制的.可以让我们一个完整的软件程序运行在不同的服务器上,实现分布式.