Hadoop RPC机制及使用

来源:互联网 发布:泰牛程序员怎么样 编辑:程序博客网 时间:2024/06/05 02:40

一、Hadoop RPC基本介绍

1.1 RPC基本概念

  远程过程调用(Remote Procedure Call,RPC)是一种通过网络从远程计算机上请求服务,但不需要了解底层网络技术的协议。
  RPC通常采用客户机/服务器模型。请求程序是一个客户机,而服务提供程序则是一个服务器。一个典型的RPC框架如下:

RPC框架

该框架主要包括以下四个部分:
(1)通信模块:两个相互协作的通信模块实现“请求—应答”协议。它们在客户机和服务器之间传递请求和应答消息,一般不会对数据包进行任何处理。

(2)Stub程序:客户端和服务端均包含Stub程序,可将之看作代理程序。它使得远程函数调用表现得跟本地调用一样,对用户程序完全透明。在客户端,它表现得就像一个本地程序,但不直接执行本地调用,而是将请求信息通过通信模块发送给服务器端。此外,当服务器端发送应答后,它会解码对应结果。在服务器端,Stub程序依次进行以下处理:解码请求消息中的参数、调用相应的服务过程和编码应答结果的返回值。

(3)调度程序:调度程序接收来自通信模块的请求消息,并根据其中的标识选择一个Stub程序处理。通常客户端并发请求量比较大时,会采用线程池提高处理效率。

(4)客户程序/服务过程:请求的发出者和请求的处理者。如果是单机环境,客户程序可直接通过函数调用访问服务过程,但在分布式环境下,需要考虑网络通信,这不得不增加通信模块和Stub程序(保证函数调用的透明性)。

1.2 RPC的基本流程

  通常而言,一个RPC请求从发送到获取处理结果,所经历的步骤如下:

(1)客户程序以本地方式调用系统产生的Stub程序;

(2)该Stub程序将函数调用按照网络通信模块的要求封装成消息包,并交给通信模块发送到远程服务器端;

(3)远程服务器端接收此消息后,将此消息发送给相应的Stub程序;

(4)Stub程序拆封消息,形成被调用过程要求的形式,并调用对应的函数;

(5)被调用函数按照所获参数执行,并将结果返回给Stub程序;

(6)Stub程序将此结果封装成消息,通过网络通信模块逐级地传输给客户程序。

1.3 Hadoop RPC的特点

(1)透明性:当用户在一台计算机的程序调用调用另一台计算机上的子程序时,对用户而言无法感觉其间涉及跨机器间的通信,像调用本地方法一样。

(2)高性能:Hadoop各个系统(如HDFS、MapReduce)均采用Master/Slave结构。其中Master实际是一个RPC server,它负责处理集群中所有Slave发送的服务请求。RPC server应是一个 高性能服务器,能够并发处理来自多用Client的RPC请求。

(3)可控性:JDK中已经自带了一个RPC框架——RMI,而RMI过于重量级且用户可控之处太少(如网络连接、超时和缓冲等均难以定值或修改),考虑到RPC是Hadoop最底层、最核心的模块之一,所以Hadoop RPC实现了自定义的RPC框架。

1.4 Hadoop中RPC的机制

  同其他RPC框架一样,Hadoop RPC主要分为四个部分:序列化层、函数调用层、网络传输层、服务器端处理框架。

(1)序列化层:序列化层的主要作用是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储。在RPC框架中,它主要用户将用户请求中的参数或者应答转化为字节流以便跨机器传输。

(2)函数调用层:函数调用层的主要功能是定位要调用的函数并执行该函数。Hadoop RPC采用Java反射机制与动态代理实现了函数调用。

(3)网络传输层:网络传输层描述了Client和Server之间消息传输的方式。Hadoop RPC采用了基于TCP/IP的Socket机制。

(4)服务器端处理框架:服务器端处理框架可被抽象为网络I/O模型。它描述了客户端与服务器端间信息交互的方式。Hadoop RPC采用基于Reactor设计模式的事件驱动I/O模型,提高了服务器端的并发处理能力。

二、Hadoop RPC的使用

2.1 环境介绍

(1)服务器端rpc-server
环境:Ubuntu 14.04、Eclipse
IP:192.168.50.130
项目结构:
这里写图片描述

(2)客户端rpc-client
环境:Win10、Eclipse
项目结构:
这里写图片描述

【注意】

  • rpc-server和rpc-client都是以“Map/Reduce Project”的方式创建的,所以不需要导包。如果是通过普通“Java Project”方式创建则需要导入Hadoop相关的依赖包。
  • rpc-server和rpc-client项目的包名要一致,否则通信过程中进行对象序列化时会出错,具体原因还不太清楚,望高手指点。

2.2 Hadoop RPC应用实例

  通常而言,Hadoop RPC使用方法可分为以下几个步骤:

(1)定义RPC协议。

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

public interface LoginServiceInterface {    //协议版本号,不同版本号的client和server之间不能相互通信    static final long versionID = 1L;    String login(String name);}

(2)实现RPC协议。

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

public class LoginServiceImpl implements LoginServiceInterface {    public String login(String name) {        return "Hello, " + name + ". Welcome you!";    }}

(3)构造并启动RPC Server。

public class LoginRpcServer {    public static void main(String[] args) throws Exception {        //创建RPC.Builder实例builder,用于构造RPC server        RPC.Builder builder = new RPC.Builder(new Configuration());        //向builder传递一些必要的参数,如主机、端口号、真实业务逻辑实例、协议接口        builder.setBindAddress("192.168.50.130").setPort(10000)                .setInstance(new LoginServiceImpl())                .setProtocol(LoginServiceInterface.class);        //构造RPC server        Server server = builder.build();        //启动server        server.start();    }}

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

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

public class LoginController {    public static void main(String[] args) throws Exception {        //通过RPC获得LoginServiceInterface的代理对象        LoginServiceInterface loginService =                RPC.getProxy(LoginServiceInterface.class, 1L, new InetSocketAddress("192.168.50.130", 10000), new Configuration());        //像本地调用一样调用服务端的方法        String result = loginService.login("flyne");        System.out.println(result);        //关闭连接        RPC.stopProxy(loginService);    }}

2.3 运行结果

(1)运行RPC server,是server端处于监听状态,等待client的请求。

这里写图片描述

通过jps命令查看LoginRpcServer进程是否启动。(其他的hadoop进程,在这里可以忽略)

这里写图片描述

(2)运行LoginController程序,在客户端的控制台输出 “Hello,walker. Welcome you!”。说明RPC调用成功。

这里写图片描述

(3)此时,服务器端会打印“rpc-server is called”,说明RPC服务器端被成功调用。

这里写图片描述

三、小结

  本文主要介绍了Hadoop RPC的机制,Hadoop RPC主要包括序列化层、函数调用层、网络传输层、服务器端处理框架四个部分。然后通过一个简单的例子实现了Hadoop RPC远程调用的过程。

【参考资料】

  1. 东风化宇,“Hadoop RPC机制及HDFS源码分析”:http://www.flyne.org/article/1095
  2. Edison Chou,“Hadoop学习笔记—3.Hadoop RPC机制的使用”:
    http://www.cnblogs.com/edisonchou/p/4285817.html
  3. 董西成,《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》