1.什么是RPC
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。这句话概括的,虽然正确,不过却略显得冗余,如果要用一句话来概括RPC是什么的话,那RPC就是在一台机子上调用另外一台机子上的方法,得到想要的结果的过程。
2.RPC的作用
在hadoop中,消息的传递分为两类:控制消息和数据消息。前者包括DataNode定期向NameNode发送心跳,得到要执行的命令。这个过程就是用RPC实现的,即,在DataNode上调用NameNode上的方法,得到想要的结果。
3.RPC的数据
那么这么看来,RPC也不过就是两台电脑间的信息通信。如果要调用另一台电脑上的方法,同时要能得到记过的话,那么至少必须具备以下条件:1.通信,2.需要调用的方法信息(包括类名,方法名,方法参数),3.调用的结果。
那么,这么看来,首先要实现的,就是能够将传入信息(比如方法参数类)、传出信息(结果参数)能够实现在网络上的传输。hadoop中对此定义为:基本数据类型和String能直接传输,而类的话,就要实现Wirtable接口才行。
public class MyWritable implements Writable {
// Some data
private int counter;
private long timestamp;
public void write(DataOutput out) throws IOException {
out.writeInt(counter);
out.writeLong(timestamp);
}
public void readFields(DataInput in) throws IOException {
counter = in.readInt();
timestamp = in.readLong();
}
public static MyWritable read(DataInput in) throws IOException {
MyWritable w = new MyWritable();
w.readFields(in);
return w;
}
}
(代码来自《hadoop源码分析》)
4.RPC的过程
那么,传输数据的过程呢?RPC是通信,而通讯的模式就是服务器/客户机,在hadoop中,NameNode充当服务器,而DataNode这充当客户机。在通讯时,首先要实现通讯协议的制定,hadoop中是使用的org.apache.hadoop.ipc.VersionedProtocol这个接口。所有要在服务器上实现的协议都要继承这个接口(RPC中的协议是以方法为基础的,可以看做是传输的是方法信息)。而在服务器上需要实现这个接口,而客户机只要保留对应接口信息就可以了。
接口定义如下:其中,getString即为要在服务器上调用的方法
public interface Datanode2NamenodeProtocil extends VersionedProtocol{
public static final long versionID = 19L;
public String getString();
}
然后,服务器端要继承并实现这个接口,并且创建一个server类,(hadoop中为org.apache.hadoop.ipc.Server),等待并接受要处理信息。
而客户机端就简单了,只要具有协议接口(如:Datanode2NamenodeProtocil ),而不用指定其实现,在hadoop中是使用org.apache.hadoop.ipc.RPC类的waitForProxy方法,得到对应的代理类,而调用时,就是能够通过得打的代理类,将信息发送的服务器上,然后将接受到的结果在进行序列化,就Over了。
5.RPC的底层
上一部分提到了,RPC客户端是实现的动态代理,那么底层呢?先看源码。
waitForProxy方法核心代码如下
while (true) {
try {
return getProxy(protocol, clientVersion, addr, conf); //这个
} catch(ConnectException se) { // namenode has not been started
LOG.info("Server at " + addr + " not available yet, Zzzzz...");
ioe = se;
} catch(SocketTimeoutException te) { // namenode is busy
LOG.info("Problem connecting to server: " + addr);
ioe = te;
}
继续F3,得到的getProxy核心代码如下
VersionedProtocol proxy =
(VersionedProtocol) Proxy.newProxyInstance(
protocol.getClassLoader(), new Class[] { protocol },
new Invoker(protocol, addr, ticket, conf, factory));
可见,此处使用的是动态代理,而代理处理类为Invoker,继续F3,查看Invoker。
Invoker中的Invoke方法如下:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
final boolean logDebug = LOG.isDebugEnabled();
long startTime = 0;
if (logDebug) {
startTime = System.currentTimeMillis();
}
ObjectWritable value = (ObjectWritable)
client.call(new Invocation(method, args), remoteId);
if (logDebug) {
long callTime = System.currentTimeMillis() - startTime;
LOG.debug("Call: " + method.getName() + " " + callTime);
}
return value.get();
}
其核心也就是,ObjectWritable value = (ObjectWritable) client.call(new Invocation(method, args), remoteId);这一句,就是得到一个实现Writeable接口的、通过client(负责通讯、连接服务器)得到的类,然后,将这个结果返回。
继续看,Invoke类中的部分源码如下:
public Invocation(Method method, Object[] parameters) {
this.methodName = method.getName();
this.parameterClasses = method.getParameterTypes();
this.parameters = parameters;
}
可见,其中包括方法变量,参数变量。
而它的写入/写出方法:
public void readFields(DataInput in) throws IOException {
methodName = UTF8.readString(in);
parameters = new Object[in.readInt()];
parameterClasses = new Class[parameters.length];
ObjectWritable objectWritable = new ObjectWritable();
for (int i = 0; i < parameters.length; i++) {
parameters[i] = ObjectWritable.readObject(in, objectWritable, this.conf);
parameterClasses[i] = objectWritable.getDeclaredClass();
}
}
public void write(DataOutput out) throws IOException {
UTF8.writeString(out, methodName);
out.writeInt(parameterClasses.length);
for (int i = 0; i < parameterClasses.length; i++) {
ObjectWritable.writeObject(out, parameters[i], parameterClasses[i],
conf);
}
}
写入/写出的信息都是关于对应方法信息、参数信息。由此可见,RPC底层通讯时,传递的信息如上所述:为方法/参数信息。
分享到:
相关推荐
Hadoop RPC(Remote Procedure Call,远程过程调用)是 Hadoop 项目中的一个重要组件,用于实现分布式系统中的通信和数据交换。下面是对 Hadoop RPC 的详细分析。 RPCInterface Hadoop RPC 的核心是 RPCInterface...
在分布式计算领域,Hadoop RPC(Remote Procedure Call)是一个至关重要的组件,它使得Hadoop生态系统中的各个服务能够相互通信,实现数据的高效处理和共享。在这个实例中,我们将深入探讨Hadoop RPC的工作原理、...
在IT行业中,分布式计算系统的重要性日益凸显,而Hadoop作为其中的佼佼者,其核心组件之一就是远程过程调用(RPC,Remote Procedure Call)。RPC允许一个程序在某个网络中的计算机上执行另一个计算机上的程序,而...
在Hadoop中,远程过程调用(RPC)是核心组件之一,它使得节点间的通信变得高效且可靠。本文将深入探讨Hadoop的RPC机制,解析其工作原理,并结合源码分析其内部实现。 一、RPC简介 RPC是一种让程序能够调用运行在...
Java操作Hadoop的RPC(Remote Procedure Call)是分布式计算领域中的关键技术,它允许在不同的进程或机器之间进行远程调用,如同本地调用一样。Hadoop作为一个开源的大数据处理框架,其RPC机制是实现各个组件如...
### Hadoop的RPC通信程序详解 #### 一、引言 在分布式系统中,远程过程调用(Remote Procedure Call, RPC)是一种重要的通信机制,它允许一台计算机上的程序调用另一台计算机上的子程序,而无需程序员了解底层网络...
Hadoop RPC是Hadoop生态系统中的基础服务,使得不同模块如HDFS、MapReduce等可以高效地协同工作。本教程将通过一个简单的Demo来讲解如何在自己的项目中利用Hadoop的RPC框架。 首先,理解RPC的基本概念是非常必要的...
1.java接口操作Hadoop文件系统(文件上传下载删除创建......2.RPC远程过程调用的java代码实现,便于理解Hadoop的RPC协议,具体使用方法可参考我的博客https://blog.csdn.net/qq_34233510/article/details/88142507
Hadoop rpc源码是从Hadoop分离出的ipc,去掉了认证部分,附录使用文档.使用前请add lib包commons-logging-*.*.*.jar(我用的是1.0.4)和log4j-*.*.*.jar(我的1.2.13) 相关blog post: ...
在Hadoop中,远程过程调用(Remote Procedure Call, RPC)是一种重要的通信机制,它允许分布式系统中的组件之间进行高效且便捷的交互。Hadoop的RPC机制基于Java的客户端-服务器模型,允许客户端调用服务器上的方法,...
在Java中模拟Hadoop的RPC通讯,主要是为了理解其连接和心跳机制,这是保证Hadoop集群稳定运行的关键部分。 RPC的核心思想是透明性,即客户端可以像调用本地方法一样调用远程服务,由RPC框架负责数据的序列化、网络...
RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种通过网络请求服务的方式,它允许程序调用另一个地址空间中的函数或方法,就像调用本地进程中的函数或方法一样简单。RPC框架主要解决分布式系统中不同...
在深入学习Hadoop源代码的过程中,RPC(Remote Procedure Call)部分是理解分布式系统通信机制的关键。RPC允许客户端在不直接了解远程服务器实现细节的情况下,调用远程服务器上的方法,仿佛这些方法是在本地执行...
接收Call调用负责接收来自RPCClient的调用请求,编码成Call对象后放入到Call队列中。这一过程由Listener线程完成。具体步骤:处理Call调用负责处理Call队列中的每个调用请求,由Handler线程完成:交互过程如下图所示...
Hadoop 使用了一种特殊的 RPC 实现来支持其分布式环境中的各种服务。 ##### 2.2 Hadoop RPC 架构 Hadoop 的 RPC 系统主要包括以下几个关键组成部分: - **Client Proxy**:客户端代理,负责向服务器发送请求并...
这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试、面试,以至于对hadoopRPC(RemoteProcedureCallProtocol,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。...
在Hadoop生态系统中,I/O操作是至关重要的组成部分,它涉及到数据的读取、处理和写入。在标题中提到的“修改Hadoop中的io写的,远程调用对象的东西”可能指的是对Hadoop的分布式文件系统(HDFS)进行定制化开发,...
Hadoop的RPC机制允许远程节点调用服务,使得分布式环境中不同节点间能够进行高效通信。Spring可以通过配置RPC客户端和服务端,实现对Hadoop服务的调用和暴露。例如,我们可以创建一个Spring Bean来封装Hadoop的...