7.hadoop RPC框架
一:RPC的百度百科
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
有多种 RPC模式和执行。最初由 Sun 公司提出。IETF ONC 宪章重新修订了 Sun 版本,使得 ONC RPC 协议成为 IETF 标准协议。现在使用最普遍的模式和执行是开放式软件基础的分布式计算环境(DCE)。
二:课程中谈到的RPC
RPC是hadoop hdfs文件系统交流的底层机制,一种远程调用协议,与WebService有所不同,是集群内部的访问,而不是跨项目的服务。
hdfs 利用 RPC来管理文件系统,客户端访问namenode,namenode通过RPC来返回相应信息,从而达到沟通的目的。
原理图如下:



三、RPC框架的简单使用
目的:在本机linux上有一个模拟登陆的程序,在我同事的linux服务器上有一个模拟登陆响应的服务。本机上只有controller层和service接口层。controller层用main方法代替,调用接口。而本机的接口访问同事的服务端,返回信息给我,我并且打印出来。
本机的代码(client):
package com.xws.rpcService; public interface RpcService { public static final long versionID=100L; public String login(String username,String password); }
package com.xws.rpcService; import java.io.IOException; import java.net.InetSocketAddress; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; public class RpcClientController { /** * 客户端获取RPC代理访问远程服务器 * @param args * @throws IOException */ public static void main(String[] args) throws IOException { //1.代理接口 2.双边版本号 3.服务器地址 4.conf对象 RpcService serviceImpl = RPC.getProxy(RpcService.class, 100, new InetSocketAddress("linux-hadoop", 10000),new Configuration()); String result = serviceImpl.login("wo", "123"); System.out.println(result); } }
服务端的代码:
package com.xws.rpcService; /** * 接口 * @author root * */ public interface RpcService { public static final long versionID=100L; public String login(String username,String password); }
package com.xws.rpcService; import java.util.Date; /* *实现类 */ public class RpcServiceImpl implements RpcService{ public String login(String username,String password){ return "login successlly"+new Date().getTime(); } }
package com.xws.rpcService; import java.io.IOException; import org.apache.hadoop.HadoopIllegalArgumentException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RPC.Builder; import org.apache.hadoop.ipc.RPC.Server; public class RpcRunner { /** * 定义一个rpc服务器端,监听RpcService类 * @param args * @throws IOException * @throws HadoopIllegalArgumentException */ public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { //创建一个Rpc builder对象 Builder builder = new RPC.Builder(new Configuration()); //builder属性设置 builder.setBindAddress("linux-hadoop")//设置地址,本机名或者ip .setPort(10000)//服务端口 .setProtocol(RpcService.class)//监听的服务接口 .setInstance(new RpcServiceImpl());//接口的实现对象 //创建一个service Server servier = builder.build(); servier.start(); } }
注意:如果客户端使用主机名来访问远程服务,那么你的本机必须有服务器主机IP和主机名的映射。

浙公网安备 33010602011771号