一、概述

Hadoop 作为分布式存储系统,各个节点之间的通信和交互是必不可少的,需要实现一套节点间的通信交互机制。RPC(Remote Procedure CallProtocol,远程过程调用协议)允许本地程序像调用本地方法一样调用远程机器上应用程序提供的服务,所以 Hadoop 实现了一套自己的 RPC 框架。Hadoop RPC 框架并没有使用 JDK 自带的 RMI (Remote Method Invocation,远程方法调用),而是基于 IPC (Inter-Process Communications,进程间通信)模型实现了一套高效的轻量级 RPC 框架,这套 RPC 框架底层采用了 JavaNIO、 Java 动态代理以及 protobuf 等基础技术。

二、Hadoop RPC 架构

2.1. 客户端

  1. 请求程序

    请求程序会像调用本地方法一样调用客户端 Stub 程序,然后接收 Stub 程序返回的响应信息。

    DFSClient 是一个实现了分布式文件系统客户端功能的类,是用户使用 HDFS 各项功能的起点。DFSClient 会连接到 HDFS,对外提供管理文件/目录、读写文件以及管理与配置 HDFS 系统等功能。

  2. Stub 程序

    客户端的 Stub 可以看作是一个代理对象,它会将请求程序的 RPC 调用序列化,并调用 Client.call() 方法将这个请求发送给远程服务器,这些实现对于客户端调用程序是完全透明的。

  3. 传输层-client

    org.apache.hadoop.ipc.Client 类以及 org.apache.hadoop.ipc.Server 类提供了基于 TCP/IP Socket 的网络通信功能,客户端可以通过 Client 类将序列化的请求发送到远程服务器,服务器会通过 Server 类接收来自客户端的请求。

rpcclient

2.2. 服务端

  1. Stub 程序

    服务器端 Stub 程序会将通信模块接收的数据反序列化,然后调用服务程序对应的方法响应 RPC 请求。

  2. 服务程序

    服务器会接收来自 Stub 程序的调用请求,执行对应的逻辑并返回执行结果。NamenodeRPCServer 是 Namenode 侧响应 ClientProtocol 调用的类,它会执行 HDFS 操作并将操作结果返回。

  3. 传输层-server

    org.apache.hadoop.ipc.Client 类以及 org.apache.hadoop.ipc.Server 类提供了基于 TCP/IP Socket 的网络通信功能,客户端可以通过 Client 类将序列化的请求发送到远程服务器,服务器会通过 Server 类接收来自客户端的请求。