Hadoop RPC远程过程调用源码解析及实例

简介:

什么是RPC?

1、RPC(Remote Procedure Call)远程过程调用,它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。经常用于分布式网络通信中。

2、Hadoop的进程间交互都是通过RPC来进行的,比如Namenode与Datanode之间,Jobtracker与Tasktracker之间等。

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中, RPC跨越了传输层和应用层。 RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息,在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息给client然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC特点

1、透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样。

2、高性能:RPC server能够并发处理多个来自Client的请求(请求队列)。3、可控性:jdk中已经提供了一个RPC框架–RMI,但是该RPC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的RPC框架。

Hadoop RPC通信

1、序列化层:Client与Server端 通信传递的信息采用了Hadoop里提供的序列化类或自定义Writable类型。

2、函数调用层:Hadoop RPC通过动态代理以及Java反射机制实现函数调用。

3、网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制。

4、服务器端框架层:RPC Server利用Java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力

Hadoop的整个体系结构就是构建在RPC之上(org.apache.hadoop.ipc)。

Hadoop RPC设计技术

1、动态代理

2、反射3、序列化4、非阻塞的异步IO(NIO)

动态代理

1、动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象。

2、动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,或需要对访问做一些特殊处理等,这时候可以考虑使用代理。3)目前Java开发包中提供了对动态代理的支持,但现在只支持对接口的实现。相关的类与接口:java.lang.reflect.Proxy--类 java.lang.reflect.InvocationHandler--接口

动态代理创建对象过程:

InvocationHandler handler = new InvocationHandlerImpl(...) Proxy.newInstance(...)

具体实现可参考如下:

Hadoop RPC远程过程调用源码解析及实例

根据上图查看hadoop2.6.0源码

Client

Server

RPC

几个重要的协议

ClientProtocol是客户端(FileSystem)与NameNode通信的接口。

DatanodeProtocol是DataNode与NameNode通信的接口NamenodeProtocol是SecondaryNameNode与NameNode通信的接口。DFSClient是直接调用NameNode接口的对象。用户代码是通过DistributedFileSystem调用DFSClient对象,才能与NameNode打交道。

模拟Hadoop RPC通信


  
  
  1. package MyRPC; 
  2. import org.apache.hadoop.io.Text; 
  3. import org.apache.hadoop.ipc.VersionedProtocol; 
  4.  
  5. public interface MyRPCProtocal extends VersionedProtocol{ 
  6.     public static long versionID = 23234l;//很重要很重要,搞了一下午才解决掉。 
  7.     public Text test(Text t); 

  
  
  1. package MyRPC; 
  2.  
  3. import java.io.IOException; 
  4. import org.apache.hadoop.conf.Configuration; 
  5. import org.apache.hadoop.io.Text; 
  6. import org.apache.hadoop.ipc.ProtocolSignature; 
  7. import org.apache.hadoop.ipc.RPC; 
  8. import org.apache.hadoop.ipc.RPC.Server; 
  9.  
  10. public class RPCServer implements MyRPCProtocal{     
  11.     Server server = null
  12.     public RPCServer() throws IOException, InterruptedException{ 
  13.         //server = RPC.getServer(this,"localhost",8888,new Configuration()); 
  14.         //相对于以前的版本有略微的改动 
  15.         RPC.Builder ins = new RPC.Builder(new Configuration()); 
  16.         ins.setInstance(this); 
  17.         ins.setBindAddress("localhost"); 
  18.         ins.setPort(9999); 
  19.         ins.setProtocol(MyRPCProtocal.class); 
  20.         //RPC.setProtocolEngine(new Configuration(), MyRPCProtocal.class, RpcEngine.class); 
  21.         server = ins.build();//获得一个server实例 
  22.         server.start(); 
  23.         server.join();   
  24.     } 
  25.  
  26.     public static void main(String[] args) throws IOException, InterruptedException { 
  27.         new RPCServer(); 
  28.     } 
  29.  
  30.     @Override 
  31.     public long getProtocolVersion(String protocol, long clientVersion) 
  32.             throws IOException { 
  33.         return MyRPCProtocal.versionID; 
  34.     } 
  35.  
  36.     @Override 
  37.     public ProtocolSignature getProtocolSignature(String protocol, 
  38.             long clientVersion, int clientMethodsHash) throws IOException {      
  39.         return new ProtocolSignature(); 
  40.     } 
  41.  
  42.     @Override 
  43.     public Text test(Text t) { 
  44.         if(t.toString().equals("RPC")){ 
  45.             return new Text("ok"); 
  46.         } 
  47.         return new Text("false"); 
  48.     } 
  49. package MyRPC; 
  50.  
  51. import java.net.InetSocketAddress; 
  52.  
  53. import org.apache.hadoop.conf.Configuration; 
  54. import org.apache.hadoop.io.Text; 
  55. import org.apache.hadoop.ipc.RPC; 
  56.  
  57. public class RPCClient { 
  58.  
  59.     private MyRPCProtocal protocal; 
  60.  
  61.     public RPCClient() throws Exception{ 
  62.         InetSocketAddress address = new InetSocketAddress("localhost",9999); 
  63.  
  64.         protocal = (MyRPCProtocal)RPC.waitForProxy 
  65.                 (MyRPCProtocal.class,MyRPCProtocal.versionID, address, new Configuration()); 
  66.         //RPC.setProtocolEngine(new Configuration(), MyRPCProtocal.class, RpcEngine.class); 
  67.     } 
  68.  
  69.     public void call(String s){ 
  70.         final Text string = protocal.test(new Text(s)); 
  71.         System.out.println(string.toString()); 
  72.     } 
  73.  
  74.     public static void main(String[] args) throws Exception { 
  75.         RPCClient client = new RPCClient(); 
  76.         client.call("RPC"); 
  77.     } 
 


本文作者:佚名

来源:51CTO

相关文章
|
4月前
|
JSON 自然语言处理 API
gRPC凭什么成为微服务通信首选?深度解析RPC进化史
本文深入解析了分布式系统中服务通信的核心机制,重点介绍了 RPC 与 gRPC 的原理、优势及使用场景,并详解 gRPC 所依赖的序列化协议 Protocol Buffers(Protobuf)。内容涵盖 RPC 概念、gRPC 特性、Protobuf 语法及服务定义,适合微服务架构设计与维护人员阅读,助你构建高性能、低耦合的服务通信体系。
608 73
gRPC凭什么成为微服务通信首选?深度解析RPC进化史
|
9月前
|
存储 缓存 负载均衡
阿里云服务器实例选择指南:热门实例性能、适用场景解析对比参考
2025年,在阿里云的活动中,主售的云服务器实例规格除了轻量应用服务器之外,还有经济型e、通用算力型u1、计算型c8i、通用型g8i、计算型c7、计算型c8y、通用型g7、通用型g8y、内存型r7、内存型r8y等,以满足不同用户的需求。然而,面对众多实例规格,用户往往感到困惑,不知道如何选择。本文旨在全面解析阿里云服务器实例的各种类型,包括经济型、通用算力型、计算型、通用型和内存型等,以供参考和选择。
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
919 29
|
9月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
391 4
|
9月前
|
存储 机器学习/深度学习 人工智能
阿里云服务器第八代通用型g8i实例评测:性能与适用场景解析
阿里云服务器通用型g8i实例怎么样?g8i实例采用CIPU+飞天技术架构,并搭载最新的Intel 第五代至强可扩展处理器(代号EMR),不仅性能得到大幅提升,同时还拥有AMX加持的AI能力增强,以及全球范围内率先支持的TDX机密虚拟机能力。这些特性使得g8i实例在AI增强和全面安全防护两大方面表现出色,尤其适用于在线音视频及AI相关应用。本文将深入探讨g8i实例的产品特性、优势、适用场景及规格族,以帮助您更好地了解这款产品,以供参考和选择。
|
9月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
9月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
存储 分布式计算 Hadoop
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
467 79
|
分布式计算 Kubernetes Hadoop
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
大数据-82 Spark 集群模式启动、集群架构、集群管理器 Spark的HelloWorld + Hadoop + HDFS
521 6

相关实验场景

更多

推荐镜像

更多
  • DNS