RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑,是分布式系统的基础 。允许运行于一台计算机上的程序像调用本地方法一样,调用另一台计算机的子程序 。由于 RPC 服务整体知识较多 , 本节仅针对对 Yarn RPC 进行简略介绍,详细内容会后续开专栏介绍 。
一、RPC 通信模型介绍为什么会有 RPC 框架?在分布式或微服务情境下,会有大量的服务间交互,如果用传统的 HTTP 协议端口来通信,需要耗费大量时间处理网络数据交换上,还要考虑编解码等问题 。如下图所示 。
![【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC](http://img.zhejianglong.com/231019/1U3193451-0.png)
文章插图
- 客户端通过 RPC 框架的动态代理得到一个代理类实例,称为 Stub(桩)
- 客户端调用接口方法(实际是 Stub 对应的方法),Stub 会构造一个请求,包括函数名和参数
- 服务端收到这个请求后,先将服务名(函数)解析出来,查找是否有对应的服务提供者
- 服务端找到对应的实现类后,会传入参数调用
- 服务端 RPC 框架得到返回结果后,再进行封装返回给客户端
- 客户端的 Stub 收到返回值后,进行解析,返回给调用者,完成 RPC 调用 。
- 透明性:像调用本地方法一样调用远程方法 。
- 高性能:Hadoop 各个系统均采用 Master/Slave 结构,Master 是一个 RPC Server 用于处理各个 Slave 节点发送的请求,需要有高性能 。
- 可控性:由于 JDK 中的 RPC 框架 RMI 重量级过大,且封装度太高,不方便控制和修改 。因此实现了自己的 RPC 框架,以保证轻量级、高性能、可控性 。
二)总体架构Hadoop RPC 架构底层依靠 Java 的 nio、反射、动态代理等功能实现「客户端 - 服务器(C/S)」通信模型 。上层封装供程序调用的 RPC 接口 。
![【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC](http://img.zhejianglong.com/231019/1U3196453-1.png)
文章插图
三、案例 demo下面两个案例的 demo 已上传至 github 。有帮助的话点个? 。https://github.com/Simon-Ace/hadoop_rpc_demo
一)RPC Writable 案例实现1、新建一个 maven 工程,添加依赖
<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>2.8.5</version></dependency>
2、定义 RPC 协议public interface BusinessProtocol {void mkdir(String path);String getName(String name);long versionID = 345043000L;}
3、定义协议实现public class BusinessIMPL implements BusinessProtocol {@Overridepublic void mkdir(String path) {System.out.println("成功创建了文件夹 :" + path);}@Overridepublic String getName(String name) {System.out.println("成功打了招呼: hello :" + name);return "bigdata";}}
4、通过 Hadoop RPC 构建一个 RPC 服务端import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.ipc.RPC;import java.io.IOException;public class MyServer {public static void main(String[] args) {try {// 构建一个 RPC server 端,提供了一个 BussinessProtocol 协议的 BusinessIMPL 服务实现RPC.Server server = new RPC.Builder(new Configuration()).setProtocol(BusinessProtocol.class).setInstance(new BusinessIMPL()).setBindAddress("localhost").setPort(6789).build();server.start();} catch (IOException e) {e.printStackTrace();}}}
5、构建一个 RPC 客户端import org.apache.hadoop.ipc.RPC;import org.apache.hadoop.conf.Configuration;import java.io.IOException;import java.net.InetSocketAddress;public class MyClient {public static void main(String[] args) {try {// 获取代理类实例,也就是 StubBusinessProtocol proxy = RPC.getProxy(BusinessProtocol.class, BusinessProtocol.versionID,new InetSocketAddress("localhost", 6789), new Configuration());// 通过 Stub 发送请求,实际使用就像调用本地方法一样proxy.mkdir("/tmp/ABC");String res = proxy.getName("Simon");System.out.println("从 RPC 服务端接收到的返回值:" + res);} catch (IOException e) {e.printStackTrace();}}}
6、测试,先启动服务端,再启动客户端服务端输出成功创建了文件夹 :/tmp/ABC成功打了招呼: hello :Simon
客户端输出从 RPC 服务端接收到的返回值:bigdata
二)RPC Protobuf 案例实现项目结构如下![【深入浅出 Yarn 架构与实现】2-2 Yarn 基础库 - 底层通信库 RPC](http://img.zhejianglong.com/231019/1U31924W-2.png)
文章插图
对 proto 文件格式不熟悉的同学,参考上一篇文章《2-1 Yarn 基础库概述》推荐阅读
- 韩国免税店购物攻略【二】
- 那个斗牛和斗地主用一样的豆玩(有哪款斗地主是用金豆的)
- 【深入浅出 Yarn 架构与实现】2-1 Yarn 基础库概述
- 2022支付宝蚂蚁庄园8月16日答案
- 欢乐斗牛怎么玩(欢乐斗牛为什么没了)
- 牛牛游戏怎么玩(斗牛五张牌做牌手法)
- 红包牛牛怎么玩(打牛牛有什么诀窍)
- 求扑克“牛牛”的玩法(牛牛纸牌攻略)
- 【操作说明】全能型H.265播放器如何使用?
- 原神8.13复原械画部件之二图文攻略