`
liaobinxu
  • 浏览: 42230 次
  • 性别: 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

 

 

 

 

 

分享到:
评论

相关推荐

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

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

    Hadoop的RPC通信程序

    使用Hadoop的RPC机制创建一个协议接口、通信服务端、通信客户端程序 目标:通过该任务,理解分布式系统中远程过程调用协议,掌握分布式系统中客户机与服务器的通信机制。

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

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

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

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

    分布式存储系统-HDFS.docx

    内容概要:  分布式文件系统与 HDFS  HDFS 体系结构与基本概念★★★  HDFS 的 shell 操作★★★  搭建 eclipse 开发环境★★ ... hadoop 的 RPC 机制★  hadoop 读写数据的过程分析★★

    Hadoop-HDFS-Shell-学习资料及文档、Java代码

    内容概要: 架构、流程、机制、原理、环境、数据...HadoopHDFS-JavaRPC操作代码,含服务端和客户端代码; hadoop生态现状、介绍、部署; hadoop2.4.1伪分布式搭建; 分布式文件系统; 复安装过程详细步骤; hdfs笔记;

    阿里巴巴开源的分布式计算系统 JStorm.zip

    基本上可以说一统江湖: 究其优点:开发非常迅速:接口简单,容易上手,只要遵守Topology、Spout和Bolt的编程规范即可开发出一个扩展性极好的应用,底层RPC、Worker之间冗余,数据分流之类的动作完全不用考虑扩展性...

    大型分布式网站架构与实践

     5.1.1 inotify机制 339  5.1.2 ActiveMQ-CPP 343  5.1.3 架构和存储 359  5.1.4 Chukwa 362  5.2 离线数据分析 369  5.2.1 Hadoop项目简介 370  5.2.2 Hadoop环境搭建 374  5.2.3 MapReduce编写 384  ...

    AvroParquetExample:一个展示 Avro 和 Parquet 功能的项目

    探索了特定的用例,例如使用单线程机制的通用镶木地板压缩,以及使用 hadoop 框架进行并行化的基于 map reduce 的版本。 可以在下面找到有关 Avro 和 Parquet 的更多信息: 阿夫罗 Apache Avro:trade_mark: 是一个...

Global site tag (gtag.js) - Google Analytics