Hadoop系列番外篇之一文搞懂Hadoop RPC框架及细节实现(深度好文,纯干货)

Hadoop RPC 框架解析

网络通信模块是分布式系统中最底层的模块。它直接支撑了上层分布式环境下复杂的进程间通信(Inter-Process Communication, IPC)逻辑,是所有分布式系统的基础。远程过程调用(Remote Procedure Call, RPC)是一种常用的分布式网络通信协议。它允许运行于一台计算机的程序调用另一台计算机的子程序,同时将网络的通信细节隐藏起来,使得用户无须额外地为这个交互作用编程。

作为一个分布式系统,Hadoop实现了自己的RPC通信协议,它是上层多个分布式子系统(如MapReduce, HDFS, HBase等)公用的网络通信模块。本文主要从框架设计和实现方面介绍Hadoop RPC,还有该RPC框架在MapReduce中的应用。

1.Hadoop RPC框架概述

1.1 RPC框架特点

RPC实际上是分布式计算中客户机/服务器(Client/Server)模型的一个应用实例。对于Hadoop RPC而言,它具有以下几个特点。

1.透明性:这是所有RPC框架的最根本特征,即当用户在一台计算机的程序调用另外一台计算机上的子程序时,用户自身不应感觉到其间涉及跨机器间的通信,而是感觉像是在执行一个本地调用。

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

3.可控性:JDK中已经自带了一个RPC框架——RMI(Remote Method Invocation,远程方法调用)。之所以不直接使用该框架,主要是因为考虑到RPC是Hadoop最底层、最核心的模块之一,保证其轻量级、高性能和可控性显得尤为重要,而RMI过于重量级且用户可控之处太少(如网络连接、超时和缓冲等均难以定制或者修改)。
在这里插入图片描述

1.2 Hadoop RPC框架

与其他RPC框架一样,Hadoop RPC主要分为四个部分,分别是序列化层、函数调用层、网络传输层和服务器端处理框架,具体实现机制如下:

序列化层:序列化层的主要作用是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储。在RPC框架中,它主要用于将用户请求中的参数或者应答转化成字节流以便跨机器传输。Hadoop自己实现了序列化框架,一个类只要实现Writable接口,即可支持对象序列化与反序列化。

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

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

服务器端处理框架:服务器端处理框架可被抽象为网络I/O模型。它描述了客户端与服务器端间信息交互的方式。它的设计直接决定着服务器端的并发处理能力。常见的网络I/O模型有阻塞式I/O、非阻塞式I/O、事件驱动I/O等,而Hadoop RPC采用了基于Reactor设计模式的事件驱动I/O模型。

Hadoop RPC总体架构自下而上可分为两层。
在这里插入图片描述

第一层是一个基于Java NIO(New IO)实现的客户机/服务器(Client/Server)通信模型。其中,客户端将用户的调用方法及其参数封装成请求包后发送到服务器端。服务器端收到请求包后,经解包、调用函数、打包结果等一系列操作后,将结果返回给服务器端。为了增强Server端的扩展性和并发处理能力,Hadoop RPC采用了基于事件驱动的Reactor设计模式,在具体实现时,用到了JDK提供的各种功能包,主要包括java.nio(NIO)、java.lang.reflect(反射机制和动态代理)、java.net(网络编程库)等。

第二层是供更上层程序直接调用的RPC接口,这些接口底层即为客户机/服务器通信模型。


看到这里有些小伙伴说我对于这些Java基础知识都不是很记得了,没关系,暖男的我现在就和大家一起来看看相关的这些Java基础内容。又有一些小伙伴说我没学过啊,那也没关系,我们知识大致去了解一些类和这些类有哪些方法可以帮助我们理解RPC就够了。我们使用Hadoop的时候不也不必关注RPC的细节么,那Java细节不会影响我们使用。对Java基础反射、网络编程和NIO很熟悉的小可爱可以直接跳过第二章节

2.Java基础知识回顾

我们简要介绍Hadoop RPC中用到的JDK开发工具包中的一些类。了解和掌握这些类的功能和使用方法是深入学习Hadoop RPC的基础。这些类主要来自以下三个Java包:java.lang.reflect(反射机制和动态代理相关类)、java.net(网络编程库)和java.nio(NIO)。

2.1 Java反射机制与动态代理

反射机制是Java语言的一个重要特性,它的重要性也不用多说,在很多的框架中,反射撑起了半边天。简言之其作用:允许用户动态获取类的信息和动态调用对象的方法。
我们先来看看它提供的主要的类和类对应的功能:

类名&接口 功能描述
Class 代表一个Java类
Field 代表Java类的属性
Method 代表Java类的方法
Constructor 代表Java类的构造函数
Array 提供了动态创建数组,以及访问数组元素的静态方法
Proxy类以及InvocationHandler接口 提供了动态生成代理类以及实例的方法

我们重点关注Java动态代理。在动态代理之前,我们先一起回顾一下代理概念及代理模式。有小可爱说不知道动态代理我只听过名字啊,具体是个什么,我不知道呀。没关系,我先简单说一下动态代理的核心思想:是为其他对象提供一种代理以控制对这个对象的访问。代理类负责为委托类进行预处理(如安全检查,权限检查等)或者执行完后的后续处理(如转发给其他代理等)。动态代理的好处就是开发人员通过简单的指定一组接口及委托类对象,便能动态地获得代理类,这大大简化了编写代理类的步骤。

2.1.1 代理关键类&接口信息

在此我们先来了解一下代理的一些关键类&接口以及其主要方法:

1)java. lang.reflect.Proxy
这是Java动态代理机制的主类,它提供了一组静态方法,用于为一组接口动态地生成代理类及其对象。

// Returns the invocation handler for the specified proxy instance.
// Params:proxy – the proxy instance to return the invocation handler for
// Returns:the invocation handler for the proxy instance
// 获取指定代理对象所关联的调用处理器
public static InvocationHandler getInvocationHandler(Object proxy)

// 获取关联于指定类装载器和一组接口的动态代理类的对象
public static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)

// 判断指定的类是不是一个动态代理类
 public static boolean isProxyClass(Class<?> cl)

// 为指定类装载器一组接口及调用处理器生成动态代理类实例
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

2)java. lang.reflect.InvocationHandler
这是调用处理器接口。它定义了一个invoke方法,用于处理在动态代理类对象上的方法调用。通常开发人员需实现该接口,并在invoke方法中实现对委托类的代理访问。

// 该方法负责处理动态代理类上的所有方法调用
// 参数:代理类实例,被调用的方法对象,调用参数
// 调用处理器根据这三个参数进行预处理或分派到委托类实例上执行
public Object invoke(Object proxy, Method method, Object[] args)
2.1.2 动态代理创建对象的过程

一个典型的动态代理创建对象的过程可分为以下4个步骤:

  • 步骤1 通过实现InvocationHandler接口创
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值