1.RPC基本概念
1.1 RPC基本概念
RPC,远程过程调用,中文名称:远程过程调用。
(1)它允许一台计算机程序远程调用另一台计算机上的子例程,而无需了解底层网络通信的细节。因此,它常用于分布式网络通信。
RPC 协议依赖于传输协议(例如TCP 或UDP)的存在来在通信程序之间传送信息数据。在OSI网络通信模型中,RPC跨越传输层和应用层。 RPC 促进了涉及网络分布式多程序的应用程序的开发。
(2)Hadoop中所有进程之间的交互都是通过RPC进行的,包括Namenode和Datanode、Jobtracker和Tasktracker之间的直接连接。
因此,我们可以说Hadoop的运行是基于RPC的。
1.1 RPC的主要特点
(1)透明性:远程调用另一台机器上的程序对用户来说与调用本地方法是一样的。
(2)高性能:RPC服务器可以同时处理来自客户端的多个请求。
(3)可控性:jdk已经提供了RPC框架(RMI),但是PRC框架太重,可控功能很少,所以Hadoop RPC实现了自定义的PRC框架。
RPC基本流程
(1)RPC采用C/S模式。
(2) 客户端向服务器发送带有参数的请求消息。
(3) 服务器收到请求后,根据发送的参数调用相应的程序,并将计算结果发送给客户端。
(4)客户端收到结果后继续执行。
1.1 Hadoop的RPC机制
与其他RPC 框架一样,Hadoop RPC 分为四个部分。
(1)序列化层:Clent和服务器之间发送的信息使用Hadoop提供的序列化类或自定义的Writable类型。
(2)函数调用层:Hadoop RPC通过动态代理和Java反射实现函数调用。
(3)网络传输层:Hadoop RPC采用基于TCP/IP的套接字机制。
(4)服务器端框架层:RPC服务器采用Java NIO,采用事件驱动的I/O模型,提高RPC服务器的并发处理能力。
Hadoop RPC 在整个Hadoop 中得到广泛应用,客户端、数据节点和名称节点之间的所有通信都依赖于它。示例:使用HDFS 时,通常使用FileSystem 类,该类内部有一个DFSClient 对象。该对象处理NameNode。在运行时,DFSClient 创建本地NameNode 代理,还可以操纵该代理通过网络远程调用NameNode 上的方法并返回值。
1.1 Hadoop RPC技术
(1)动态代理
动态代理可以提供对另一个对象的访问,同时隐藏有关实际对象的某些事实。代理对象向客户端隐藏实际对象。 Java开发包目前提供了对动态代理的支持,但目前仅支持接口的实现。
(2)动态加载反射——个类。
(3)系列化
(4)非阻塞异步IO(NIO)
1.如何使用RPC
2.1 Hadoop RPC对外提供的接口
Hadoop RPC主要提供两个外部接口(参见类org.apache.hadoop.ipc.RPC):
(1) public static T ProtocolProxy T getProxy/waitForProxy(.)
构造一个客户端代理对象(该对象实现特定协议)向服务器发送RPC请求。
(2)公共静态Server RPC.Builder(配置).build()
为处理客户端发送的请求的协议实例(实际上是Java 接口)构造一个服务器对象。
2.2 使用Hadoop RPC的四个主要步骤
(1)定义RPC协议
RPC协议是客户端和服务器之间的通信接口,定义了服务器提供的服务接口。
(2)RPC协议的实现
Hadoop RPC 协议通常是您必须实现的Java 接口。
(3)搭建并启动RPC SERVER
直接使用静态类Builder构建一个RPC服务器,并通过调用函数start()启动服务器。
(4)搭建RPC客户端并发送请求
使用静态方法getProxy构造一个客户端代理对象,并通过该代理对象直接调用远端方法。
2. RPC应用机制
3.1 定义RPC协议
定义IProxyProtocol 通信接口并声明Add() 方法,如下所示。
以下是一些需要记住的事情:
(1)Hadoop中所有自定义的RPC接口都必须继承VersionedProtocol接口,该接口描述了协议版本信息。
(2) 默认情况下,不同版本号的RPC客户端和服务器端无法通信,因此客户端和服务器端通过版本号来标识。
3.2 实现RPC协议
Hadoop RPC 协议通常是您必须实现的Java 接口。 IProxyProtocol 接口的一个简单实现是:
//注意:这里返回的版本号必须与客户端提供的版本号一致。
这里实现的Add方法非常简单,是一个加法操作。看看效果,下面是控制台输出的语句: “我被叫了!”
3.3 搭建RPC服务器并启动服务
这里,Server对象是通过RPC静态方法getServer获取的,如下代码所示。
这段代码的核心在第5行的RPC.getServer方法中。该方法有四个参数。第一个参数是要调用的Java对象,第二个参数是服务器的地址,第三个参数是服务器端口。服务器。获得服务器对象后,启动服务器。这样服务器就可以在指定端口上监听客户端请求。此时,服务器处于监听状态,不断等待客户端请求的到来。
3.4 构建RPC客户端并执行请求
这里,使用静态方法getProxy 或waitForProxy 构造了一个客户端代理对象,并通过该代理对象直接调用远端方法,如下所示。
//注意:这里传递的版本号必须与代理匹配
上面代码的核心是RPC.waitForProxy(),它有四个参数:第一个参数是被调用的接口类,第二个参数是客户端版本号,第三个参数是客户端版本号。返回的代理对象是服务器对象的代理,内部使用java.lang.Proxy实现。
经过以上四个步骤,我们已经使用Hadoop RPC 构建了一个非常高效的客户端/服务器网络模型。
3.5 查看执行结果
(1)启动服务器并开始监听客户端请求。
(2)启动客户端,开始向服务器发送请求。
(3) 检查状态,看看服务器是否正在被调用。
总结:从上面的RPC调用中我们可以看到,在客户端调用的业务类的方法都是在业务类的接口中定义的。该接口实现VersionedProtocal 接口。
(4)在命令行中运行jps命令,查看输出信息,如下图所示。
在上图中,您可以看到一个名为“MyServer”的Java 进程。这个进程就是我们刚刚运行的RPC的服务器类MyServer。因此,您可以假设在设置Hadoop 环境时,您还运行了此命令来检查是否启动了所有Hadoop 相关进程。
总结:因此,我们可以得出结论,Hadoop启动时产生的5个Java进程也是RPC服务器。
接下来,你可以看到NameNode实际上创建了一个RPC服务器,如下图所示。
原创文章,作者:小条,如若转载,请注明出处:https://www.sudun.com/ask/85051.html