Hadoop源码解析之RPC协议

Hadoop源码解析之RPC协议

 

1. RPC的基础概念

RPC,即RemoteProcdure Call,中文名:远程过程调用。

它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。

Hadoop RPC在整个Hadoop中应用非常广泛,Client、DataNode、NameNode之间的通讯都是通过RPC来进行的,因此可以说:Hadoop的运行就是建立在RPC基础之上的。

2. 如何使用RPC

2.1 Hadoop RPC对外提供的接口

  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.2 使用Hadoop RPC的四个步骤

  (1)定义RPC协议

RPC协议是客户端和服务器端之间的通信接口,它定义了服务器端对外提供的服务接口。

/**
*Hadoop中所有自定义RPC接口都需要继承VersionedProtocol接口,它描述了协议的版本信息。
 */
public interface ClientProtocol extendsVersionedProtocol {
         //版本号,默认情况下,不同版本号的RPC客户端与Server之间不能相互通信
         public static  final  long versionID = 1L;
         public int  add(int v1, int v2);
}

  (2)实现RPC协议

HadoopRPC协议通常是一个Java接口,用户需要实现该接口。

public class ClientProtocolImpl implements ClientProtocol {
         @Override
         public long getProtocolVersion(String protocol, long clientVersion)
                            throwsIOException {
                   return versionID;
         }
 
         @Override
         public ProtocolSignature getProtocolSignature(String protocol,
                            long clientVersion, int clientMethodsHash) throws IOException {
                   return new ProtocolSignature(versionID, null);
         }
 
         @Override
         public int add(int v1, int v2) {
                   return v1 + v2;
         }
}

  (3)构造和启动RPC SERVER

直接使用静态类Builder构造一个RPC Server,并调用函数start()启动该Server。

public class RPCServer {
         private static final String HOST = "localhost";
         private static final int PORT = 2181;
         publics tatic void main(String[] args) throws IOException {
                   System.out.println("Iam server!");
                   Configurationconf = new Configuration();
 
                   Server server = new RPC.Builder(conf).setProtocol(ClientProtocol.class)
                                     .setInstance(newClientProtocolImpl()).setBindAddress(HOST)
                                     .setNumHandlers(5)
                                     .setPort(PORT).build();
                   server.start();
                  
         }
}

  (4)构造RPC Client并发送请求

使用静态方法getProxy构造客户端代理对象,直接通过代理对象调用远程端的方法。

public class RPCClient {
         private static final String HOST = "localhost";
         private static final int PORT = 2181;
 
         public static void main(String[] args) throws IOException {
                   System.out.println("Iam clint!");
                   Configuration conf = new Configuration();
                   ClientProtocol proxy = RPC.getProxy(ClientProtocol.class, ClientProtocol.versionID,
                                     newInetSocketAddress(HOST, PORT), conf);
                   System.out.println("callproxy.add().");
                   int result = proxy.add(2, 4);
                   System.out.println(result);
                  
         }
}

3. 源代码

github源码地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值