远程过程: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机制的.可以让我们一个完整的软件程序运行在不同的服务器上,实现分布式.