RPC(Remote Procedure Call) 是 Hadoop 服务通信的关键库,支撑上层分布式环境下复杂的进程间(Inter-Process Communication, IPC)通信逻辑,是分布式系统的基础。允许运行于一台计算机上的程序像调用本地方法一样,调用另一台计算机的子程序。
由于 RPC 服务整体知识较多,本节仅针对对 Yarn RPC 进行简略介绍,详细内容会后续开专栏介绍。
为什么会有 RPC 框架?
在分布式或微服务情境下,会有大量的服务间交互,如果用传统的 HTTP 协议端口来通信,需要耗费大量时间处理网络数据交换上,还要考虑编解码等问题。如下图所示。
Hadoop RPC 是 Hadoop 自己实现的一个 RPC 框架,主要有以下几个特点:
框架原理和整体执行流程与第一节介绍的 RPC 框架一致,感兴趣可深入源码进行了解。
Hadoop RPC 架构底层依靠 Java 的 nio、反射、动态代理等功能实现「客户端 - 服务器(C/S)」通信模型。
上层封装供程序调用的 RPC 接口。
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 { @Override public void mkdir(String path) { System.out.println("成功创建了文件夹 :" + path); } @Override public 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 { // 获取代理类实例,也就是 Stub BusinessProtocol 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
对 proto 文件格式不熟悉的同学,参考上一篇文章《2-1 Yarn 基础库概述》
标签:Yarn,架构,基础,底层,模型,框架,服务端,客户端,定义,STUB,请求, 来源:
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。