Hadoop RPC机制
Posted JKerving
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop RPC机制相关的知识,希望对你有一定的参考价值。
Hadoop作为分布式存储系统,各个节点之间的通信和交互必不可少,所以需要实现一套节点间的通信交互机制。RPC(Remote Procedure CallProtocol,远程过程调用协议)允许本地程序像调用本地方法一样调用远程机器上应用程序提供的服务,所以Hadoop实现了一套自己的RPC框架。Hadoop RPC框架没有使用JDK自带的RMI,而是基于IPC(Inter Process Communications,进程间通信)模型实现了一套高效的轻量级RPC框架,这套RPC框架底层主要采用Java NIO、动态代理以及protobuf等基础技术。
RPC是一种通过网络调用远程计算机服务的协议。RPC协议假定存在某些网络传输协议,如TCP或UDP,RPC会使用这些协议传递RPC请求以及响应信息,RPC协议使得分布式程序的开发更加容易。
RPC采用客户端/服务器模式。请求程序就是一个客户端,而服务提供程序就是一个服务器。客户端首先会发送一个有参数的调用请求到服务器,然后等待服务器发回响应信息。在服务器端,服务提供程序会保持睡眠状态直到有调用请求到达为止。当一个调用请求到达后,服务提供程序会执行调用请求,计算结果,向客户端发送响应信息,然后等待下一个调用请求。最后,客户端成功地接收服务器发回的响应信息,一个远程调用结束。
如上图所示,给出了RPC框架的架构:
- 通信模块:传输RPC协议请求和响应的网络通信模块,可以基于TCP协议,也可以基于UDP协议,可以是同步的,也可以是异步的。
- 客户端Stub程序:服务器和客户端都包括Stub程序。在客户端,Stub程序表现得就像本地程序一样,但是底层却会将调用请求和参数序列化并通过通信模块发送给服务器。之后Stub会等待服务器的响应信息,将响应信息反序列化并返回给请求程序。可以理解为就是一个代理对象,会通过动态代理生成一个客户端Proxy类。
- 服务端Stub程序:在服务器端,Stub程序会将远程客户端发送的调用请求和参数反序列化,根据调用信息触发对应的服务程序,然后将服务程序返回的响应信息序列化并反馈给客户端。同样理解,是服务端的一个代理对象,通过动态代理生成服务器Proxy类。
- 请求程序:请求程序会像调用本地方法一样调用客户端Stub程序,然后接收Stub程序返回的响应信息。
- 服务程序:服务器会接收来自Stub程序的调用请求,执行对应的逻辑并返回执行结果。
我们可以将Hadoop RPC框架的使用抽象成以下几个步骤:
- 定义RPC协议:RPC协议是客户端和服务器之间的RPC调用的接口,只有定义了RPC协议,客户端才知道服务器对外提供了哪些服务。这里以ClientProtocol为例,ClientProtocol定义了NameNode服务器与HDFS客户端之间的接口,HDFS客户端调用ClientProtocol.rename方法,NameNode服务器就会更改指定HDFS文件的文件名。
- 实现RPC协议:服务器端的服务程序需要实现RPC协议,当RPC调用通过网络到达服务器时,实现了RPC协议的服务器程序会响应这个RPC调用。还是以ClientProtocol为例,NameNode端的NameNodeRpcServer类实现了ClientProtocol协议,当ClientProtocol RPC请求到达NameNode时,会由NameNodeRpcServer类响应这个RPC请求。
- 客户端获取代理对象:客户端需要调用RPC.getProtocolProxy()方法获取一个RPC协议的代理对象,之后客户端调用程序就可以在这个代理对象上调用RPC协议的方法,通过Java动态代理机制,这个RPC请求会由一个InvocationHandler代理对象处理,InvocationHandler对象会将RPC调用信息和调用参数序列化,最后通过调用Client.call()方法将这个请求发送到远程服务器。
- 服务器构造并启动RPC Server:服务器需要调用RPC.Builder.build()方法构造一个Server对象,然后调用Server.start()方法启动这个Server对象响应来自客户端的RPC请求。对于NameNodeRPCServer类而言,它会构造两个Server对象分别响应来自HDFS客户端和DataNode的RPC请求。
以上是关于Hadoop RPC机制的主要内容,如果未能解决你的问题,请参考以下文章