`
liaobinxu
  • 浏览: 43285 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

Hadoop里的RPC机制过程

 

已经有文章描述RPC的具体结构,http://caibinbupt.iteye.com/blog/280790,这篇文章很清晰的描述了Client和Server的结构,但是较为高屋建瓴,我在看的时候依然觉得无法清晰理解其调用过程,所以将过程整理出来,知道how,才容易理解why,即知道是怎么干的,才容易理解为什么会那么去设计。

客户端C要发起向服务端S的关于方法M调用
1. C首先创建一个通向S的连接getConnection,然后将此次调用放入CallList里,这样客户端就可以同时发生很多调用,每个调用用ID来识别。
2. 发送调用参数。调用参数是Client的调用方(比如NameNode,DataNode等)指定的,一般就是一个Invocation对象,里面包含要调用的方法和参数。了解JAVA动态代理类java.lang.reflect.Proxy会对这里的理解有很大帮助。
3. 等待调用结果.Client.Connection是个线程类,启动了之后唯一做的时候就是等待调用结果

对于服务器端,其有一个方法start指定了启动服务器开始监听,这个start被四个类调用,分别是
TaskTracker.initialize,Namenode.initialize,Jobtracker.offerService,
Datanode.startDatanode
显然,任何两者之间的通信都是考这个client-server模型实现的。
server start后,干了三件事
1. 启动listen,监听客户端Call
2. 启动response,随时准备将处理结果发回client
3. 启动10个handler,处理具体的请求。

这里必须对java NIO机制了解,才能看的明白。

当客户端调用来到的时候
1. listen首先将调用doaccept将Connection附加给selectionkey,然后调用doread添加,doread会调用Connecton的方法将调用添加到调用列表,该列表是BlockingQueue,其保持列表先进先出的特性而且支持同步
2. listen将call添加到calllist后,handler因为一直在检测calllist,于是其立刻开始处理,处理完毕后,其将结果保存在call对象中,然后调用response开始向客户端写。这里hadler调用的call只是一个未实现的方法,具体实现在RPC.Server中,这点需要注意。
3. Response也监视responselist,如果responselist中某个call需要将结果写入客户端,就写出,当某个call的结果被发送完毕,从responselist中删除该call对象。

这里有个细节:handler完成call之后就开始向客户端写call结果,但是结果可能太多,无法通过一次性发送完毕,而发送之后还要等待client接受完毕才能再发,如果现在handler在那里等待客户端接受完毕,然后再发,效率不高。解决办法是handler处理完毕之后,只向client发送一次处理结果。如果这一次将处理结果发送完毕,接下来就没有response的事情了,如果没有发送完毕,接下来response负责将剩下的处理结果发送给客户端。这样handler的并发量会大一些。

服务器实现中大量利用监视队列,比如handler就直观坚持calllist,一旦发现数据就开始处理,而response就监视responselist,发现数据需要发送就开始发送。

写完了之后,觉得写的也不清楚,可能要清晰明白只能自己看代码吧。
还发现在没用过java的情况下看hadoop可以更快的学习java

 

【转】Hadoop里的RPC机制过程 http://blog.chinaunix.net/u3/94300/showart_1900094.html

 

 

Hadoop系列-IPC模型

 

 

IPC

  • 实现RPC的一种方法,具有快速、简单的特点。 它不像Sun公司提供的标准RPC包,基于Java序列化。
  • IPC无需创建网络stubs和skeletons。
  • IPC中的方法调用要求参数和返回值的数据类型必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。接口方法应该只抛出IOException异常。

使用模型

  • 采用客户/服务器模型
  • Server:它把Java接口暴露给客户端。指定好监听端口和接受远程调用的对象实例后,通过RPC.getServer()可以得到Server实例。
  • Client:连接Server,调用它所暴露的方法。Client必须指定远程机器的地址,端口和Java接口类,通过RPC.getClient()可以得到Client实例。
  • Server不可以向Client发出调用,但在Hadoop中,有双向调用的需求。 比如在DFS,NameNode和DataNode需要互相了解状态。

 (www.iocblog.net 文章来源)

【转】http://www.iocblog.net/project/hadoop/hadoop-5.html

 

 

Hadoop系列-IPC之代码实现

 

 

  • 整体结构:在IPC包中,最重要的3个类是Server,Client和RPC,它们具有层次化的结构。
  1. RPC类是对Server、Client的具体化。在RPC类中规定,客户程序发出请求调用时,参数类型必须是Invocation;从服务器返回的值类型必须是ObjectWritable。为了加强理解,可以查看测试类TestIPC。在那里,规定的参数类型与返回值类型都是LongWritable。
  2. RPC类是对Server、Client的包装,简化用户的使用。如果一个类需充当服务器,只需通过RPC类的静态方法getServer获得Server实例,然后start。同时此类提供协议接口的实现。如果一个类充当客户端,可以通过getProxy或者waitForProxy获得一个实现了协议接口的proxy object,与服务器端交互。为了加强理解,可以查看测试类TestRPC,在那里,实现的协议接口为TestProtocol。
  • Server类
  1. 启动Listener进程。如果收到需要建立连接的请求,将建立连接,然后在上面捕获读操作的命令。收到命令之后,将把解析客户端发过来信息的工作委派给Connection。Connection把信息封装到Call对象中,放入队列中,待Handler处理。
  2. 启动指定数目的Handler线程,处理客户端对指定方法调用的请求,然后把结果返回给客户端。
  • Client类
  1. 用Call封装好调用信息,然后借助从连接池中取出的Connection向服务器端发送,等待结果。如果到指定服务器的Connection不存在,将马上建立。Connection线程读取服务器方法调用的返回信息。完成之后,通知主线程。
  • RPC类
  1. 对外使用的窗口,隐藏了Server和Client的背后细节,验证RPC协议版本。

[翻译]Using Hadoop IPC/RPC for distributed applications

 

在分布式应用程序中使用Hadoop IPC/RPC

原文地址:http://www.supermind.org/blog/520/using-hadoop-ipcrpc-for-distributed-applications

本文来自于:http://gpcuster.cnblogs.com

译文:

关于Hadoop IPC

我们一起来了解Hadoop IPC,这是一个内进程间通信(Inter-Process Communication)的子系统。Hadoop IPC被用于在一个进程的程序与另一个进程的程序进行通信

Hadoop IPC 
1.与SOAP和XML-RPC不同,Hadoop IPC使用java中的DataOutputStream与DataInputStream进行二进制的序列化。 
2. 它是一个简洁的,低消耗的RPC机制。 
3. 它只支持单播的操作。

为什么Hadoop的IPC实现不使用RMI或者是java.io.Serialization呢? 理由摘自what Doug has to say:

在我们开启Hadoop项目的时候,为什么不使用Serialization?因为当我们需要对对象进行精确的读和写操作时,这么做对似乎过于笨重了。

不适用RMI的理由是类似的。有效的IPC对于Hadoop来说是至关重要的。我觉得我们需要精确控制这些事情,比如连接,超时,缓存等等。而RMI就达不到这些需求。

示例代码

现在,我们一起来看看Hadoop IPC的示例代码,看看他们究竟是如何工作的。

一般来说,所有的单播PRC调用都会包含一个客户端和一个服务端。

创建一个服务端,

Configuration conf = new Configuration();
Server server = RPC.getServer(this, "localhost", 16000, conf);  // start a server on localhost:16000
server.start();
 

创建一个客户端,

Configuration conf = new Configuration();
InetSocketAddress addr = new InetSocketAddress("localhost", 16000);  // the server's inetsocketaddress
ClientProtocol client = (ClientProtocol) RPC.waitForProxy(ClientProtocol.class,
ClientProtocol.versionID, addr, conf);
 

在这个示例中,服务端的class实现了ClientProtocol接口,ClientProtocol.java代码看上去是这个样子的:

 

interface ClientProtocol extends org.apache.hadoop.ipc.VersionedProtocol {
  public static final long versionID = 1L;
 
  HeartbeatResponse heartbeat();
}
 

 

ClientProtocol接口中只定义了一个方法:heartbeat() ,这个方法将返回一个HeartbeatResponse对象。远程的客户端通过周期性地调用heartbeat()方法让服务端了解客户端的情况。然后服务端返回一个HeartbeatResponse对象,是的客户端获得相应的信息。

一个HeartbeatResponse.java代码看起来是这个样子的:

 

public class HeartbeatResponse implements org.apache.hadoop.io.Writable {
  String status;
 
  public void write(DataOutput out) throws IOException {
    UTF8.writeString(out, status);
  }
 
  public void readFields(DataInput in) throws IOException {
    this.status = UTF8.readString(in);
  }
}
 

 

总结

对于Hadoop IPC的总结如下:  
1. 服务端实现了ClientProtocol接口。 
2. 一个或多个客户端将调用ClientProtocol接口的方法。 
3. 在ClientProtocol接口的方法中所使用的所有参数或对象都需要继承于org.apache.hadoop.io。

【转】http://www.cnblogs.com/gpcuster/archive/2009/09/06/1561423.html

 

 

 

 

 

分享到:
评论

相关推荐

    Hadoop RPC机制分析

    《Hadoop RPC机制详解》 在分布式计算领域,Hadoop是一个不可或缺的名字,它提供了一整套处理大数据的框架。在Hadoop中,远程过程调用(RPC)是核心组件之一,它使得节点间的通信变得高效且可靠。本文将深入探讨...

    Hadoop_RPC详细分析.doc

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

    hadoop rpc实例

    在这个实例中,我们将深入探讨Hadoop RPC的工作原理、客户端(`hadoop_rcp_client`)与服务器端(`hadoop_rpc_server`)的角色以及它们之间的交互过程。 ### Hadoop RPC概述 Hadoop RPC是Hadoop框架中用于进程间...

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

    RPC(RemoteProcedureCall)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPCServer实现了一种抽象的RPC服务,同时提供Call队列。RPCServer作为服务提供者由两个...

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

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

    Hadoop的RPC通信程序

    本文将详细介绍如何使用Hadoop的RPC机制创建一个简单的协议接口、通信服务端和通信客户端程序。这不仅有助于理解分布式系统中的RPC协议,还能深入了解客户机与服务器之间的通信机制。 #### 二、创建RPC通信程序 ##...

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

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

    java_RPC_hadoop.zip

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

    Hadoop序列化机制

    标题中的“Hadoop序列化机制”是指Hadoop生态系统中用于数据传输和存储的数据表示方式,它是Hadoop MapReduce和Hadoop Distributed File System (HDFS)等组件之间交换数据的关键技术。序列化是将对象转化为可存储或...

    rpc架构与hadoop分享

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

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

    Hadoop中的RPC机制是基于Java的IPC(Inter-Process Communication)实现的,它在设计时考虑了性能、效率和可控制性,因此与RMI(Remote Method Invocation)等其他RPC方案有所不同。 1. **RPC原理**: Hadoop的RPC...

    学习hadoop_源代码,RPC_部分

    其中,Hadoop 的远程过程调用(RPC)机制是其核心组件之一,用于实现不同节点之间的高效通信。本文将详细介绍 Hadoop RPC 的基本概念、工作原理以及其实现细节。 #### 二、Hadoop RPC 基本介绍 ##### 2.1 RPC 概念...

    hadoop与spring结合

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

    Hadoop学习笔记—3.HadoopRPC机制的使用

    RPC,即RemoteProcdureCall,中文名:远程过程调用;(1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。RPC协议...

Global site tag (gtag.js) - Google Analytics