Hadoop之——HDFS的RPC机制

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51508795

RPC 是远程过程调用(Remote Procedure Call),即远程调用其他虚拟机中运行的 java object。RPC 是一种客户端/服务器模式,那么在使用时包括服务端代码和客户端代码,还有我们调用的远程过程对象。HDFS 的运行就是建立在此基础之上的。本文通过分析实现一个简单的 RPC 程序来分析HDFS 的运行机理。

下面的代码是服务端代码:

/**
 * RPC服务端代码
 * @author liuyazhuang
 * @date 2016-05-26
*/
public class MyServer {
	public static final int SERVER_PORT = 12345;
	public static final String SERVER_ADDRESS = "localhost";
	public static void main(String[] args) throws IOException {
		final Server server = RPC.getServer(new MyBiz(), SERVER_ADDRESS,
		SERVER_PORT, new Configuration());
		server.start();
	}
}

核心在于 RPC.getServer 方法,该方法有四个参数,第一个参数是被调用的 java对象,第二个参数是服务器的地址,第三个参数是服务器的端口。获得服务器对象后,启动
服务器。这样,服务器就在指定端口监听客户端的请求。
下面的代码是被调用的远程对象类:

/**
 * 被调用的远程对象类
 * @author liuyazhuang
 * @date 2016-05-26
*/
public class MyBiz implements MyBizable{
	public static long BIZ_VERSION = 2345234L;
	@Override
	public String hello(String name){
		System.out.println("我被调用了");
		return "hello "+name;
	}
	@Override
	public long getProtocolVersion(String protocol, long clientVersion) throws IOException {
		return BIZ_VERSION;
	}
}
被调用的远程对象实现了接口 MyBizable,这里面有两个方法被实现,一个就是 hello方法,另一个是 getProtocalVersion 方法。这个 hello 方法内部有个输出语句。
下面的代码是远程调用类的接口定义:

/**
 * 远程调用类的接口
 * @author liuyazhuang
 * @date 2016-05-26
*/
public interface MyBizable extends VersionedProtocol{
	public abstract String hello(String name);
}
这个接口中的方法就是刚才的 Biz 中实现的方法。接口继承的 VersionedProtocal,是hadoop 的 RPC 的接口,所有的 RPC 通信必须实现这一接口,用于保证客户端和服务端的端口一致。服务端被调用的类必须继承这个接口 VersionedProtocal。
下面是客户端代码,这里使用的调用对象的接口:

/**
 * 客户端代码
 * @author liuyazhuang
 * @date 2016-05-26
*/
public class MyClient {
	public static void main(String[] args) throws Exception {
		final MyBizable proxy = (MyBizable)RPC.getProxy(MyBizable.class,
		MyBiz.BIZ_VERSION, new InetSocketAddress(MyServer.SERVER_ADDRESS,
		MyServer.SERVER_PORT), new Configuration());
		//调用接口中的方法
		final String result = proxy.hello("world");
		System.out.println(result);
		//本质是关闭网络连接
		RPC.stopProxy(proxy);
	}
}
以上代码中核心在于 RPC.getProxy(),该方法有四个参数,第一个参数是被调用的接口类,第二个是客户端版本号,第三个是服务端地址。返回的代理对象,就是服务端对象的代理,内部就是使用 java.lang.Proxy 实现的。运行时,先启动服务端,再启动客户端。可以在服务端和客户端输出信息来打印自己想要的内容。
从上面的 RPC 调用中,可以看出:在客户端调用的业务类的方法是定义在业务类的接口中的。该接口实现了 VersionedProtocal 接口。
现在我们在命令行执行 jps 命令,查看输出信息.如图 所示


可以看到一个 java 进程,是“MyServer” ,该进程正是我们刚刚运行的 rpc 的服务端类MyServer。大家可以联想到我们搭建 hadoop 环境时,也执行过该命令用来判断 hadoop 的进程是否全部启动,那么可以判断,hadoop 启动时产生的 5 个 java 进程也应该是RPC 的服务端。我们观察 NameNode 的源代码,如图:


可以看到 NameNode 确实创建了RPC 的服务端。

至此,Hadoop HDFS的RPC机制分析完毕。

注意:调用方(也可以称为客户端)也必须有和服务端一样的一个接口,代码一致,且所在包也需得一致(实测如果包名不一致的话,会报org.apache.hadoop.ipc.RpcServerException): Unknown protocol 异常):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰 河

可以吃鸡腿么?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值