`
xiaoluobo6666
  • 浏览: 13769 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
文章分类
社区版块
存档分类
最新评论

hadoop中RPC小析

 
阅读更多
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详细分析.doc

    Hadoop RPC(Remote Procedure Call,远程过程调用)是 Hadoop 项目中的一个重要组件,用于实现分布式系统中的通信和数据交换。下面是对 Hadoop RPC 的详细分析。 RPCInterface Hadoop RPC 的核心是 RPCInterface...

    hadoop rpc实例

    在分布式计算领域,Hadoop RPC(Remote Procedure Call)是一个至关重要的组件,它使得Hadoop生态系统中的各个服务能够相互通信,实现数据的高效处理和共享。在这个实例中,我们将深入探讨Hadoop RPC的工作原理、...

    hadoop中RPC协议的小测试例子(吴超老师)

    在IT行业中,分布式计算系统的重要性日益凸显,而Hadoop作为其中的佼佼者,其核心组件之一就是远程过程调用(RPC,Remote Procedure Call)。RPC允许一个程序在某个网络中的计算机上执行另一个计算机上的程序,而...

    Hadoop RPC机制分析

    在Hadoop中,远程过程调用(RPC)是核心组件之一,它使得节点间的通信变得高效且可靠。本文将深入探讨Hadoop的RPC机制,解析其工作原理,并结合源码分析其内部实现。 一、RPC简介 RPC是一种让程序能够调用运行在...

    java操作hadoop的RPC,源码

    Java操作Hadoop的RPC(Remote Procedure Call)是分布式计算领域中的关键技术,它允许在不同的进程或机器之间进行远程调用,如同本地调用一样。Hadoop作为一个开源的大数据处理框架,其RPC机制是实现各个组件如...

    Hadoop的RPC通信程序

    ### Hadoop的RPC通信程序详解 #### 一、引言 在分布式系统中,远程过程调用(Remote Procedure Call, RPC)是一种重要的通信机制,它允许一台计算机上的程序调用另一台计算机上的子程序,而无需程序员了解底层网络...

    Hadoop自己的Rpc框架使用Demo

    Hadoop RPC是Hadoop生态系统中的基础服务,使得不同模块如HDFS、MapReduce等可以高效地协同工作。本教程将通过一个简单的Demo来讲解如何在自己的项目中利用Hadoop的RPC框架。 首先,理解RPC的基本概念是非常必要的...

    Hadoop Java接口+RPC代码实现

    1.java接口操作Hadoop文件系统(文件上传下载删除创建......2.RPC远程过程调用的java代码实现,便于理解Hadoop的RPC协议,具体使用方法可参考我的博客https://blog.csdn.net/qq_34233510/article/details/88142507

    Hadoop rpc源码

    Hadoop rpc源码是从Hadoop分离出的ipc,去掉了认证部分,附录使用文档.使用前请add lib包commons-logging-*.*.*.jar(我用的是1.0.4)和log4j-*.*.*.jar(我的1.2.13) 相关blog post: ...

    Hadoop里的RPC机制过程

    在Hadoop中,远程过程调用(Remote Procedure Call, RPC)是一种重要的通信机制,它允许分布式系统中的组件之间进行高效且便捷的交互。Hadoop的RPC机制基于Java的客户端-服务器模型,允许客户端调用服务器上的方法,...

    java_RPC_hadoop.zip

    在Java中模拟Hadoop的RPC通讯,主要是为了理解其连接和心跳机制,这是保证Hadoop集群稳定运行的关键部分。 RPC的核心思想是透明性,即客户端可以像调用本地方法一样调用远程服务,由RPC框架负责数据的序列化、网络...

    rpc架构与hadoop分享

    RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种通过网络请求服务的方式,它允许程序调用另一个地址空间中的函数或方法,就像调用本地进程中的函数或方法一样简单。RPC框架主要解决分布式系统中不同...

    学习hadoop源代码,RPC部分.pdf

    在深入学习Hadoop源代码的过程中,RPC(Remote Procedure Call)部分是理解分布式系统通信机制的关键。RPC允许客户端在不直接了解远程服务器实现细节的情况下,调用远程服务器上的方法,仿佛这些方法是在本地执行...

    hadooprpc机制&&将avro引入hadooprpc机制初探

    接收Call调用负责接收来自RPCClient的调用请求,编码成Call对象后放入到Call队列中。这一过程由Listener线程完成。具体步骤:处理Call调用负责处理Call队列中的每个调用请求,由Handler线程完成:交互过程如下图所示...

    学习hadoop_源代码,RPC_部分

    Hadoop 使用了一种特殊的 RPC 实现来支持其分布式环境中的各种服务。 ##### 2.2 Hadoop RPC 架构 Hadoop 的 RPC 系统主要包括以下几个关键组成部分: - **Client Proxy**:客户端代理,负责向服务器发送请求并...

    [HBase]源码级强力分析hadoop的RPC机制

    这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试、面试,以至于对hadoopRPC(RemoteProcedureCallProtocol,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。...

    修改hadoop中的io写的,远程调用对象的东西。

    在Hadoop生态系统中,I/O操作是至关重要的组成部分,它涉及到数据的读取、处理和写入。在标题中提到的“修改Hadoop中的io写的,远程调用对象的东西”可能指的是对Hadoop的分布式文件系统(HDFS)进行定制化开发,...

    hadoop与spring结合

    Hadoop的RPC机制允许远程节点调用服务,使得分布式环境中不同节点间能够进行高效通信。Spring可以通过配置RPC客户端和服务端,实现对Hadoop服务的调用和暴露。例如,我们可以创建一个Spring Bean来封装Hadoop的...

Global site tag (gtag.js) - Google Analytics