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,它们具有层次化的结构。
- RPC类是对Server、Client的具体化。在RPC类中规定,客户程序发出请求调用时,参数类型必须是Invocation;从服务器返回的值类型必须是ObjectWritable。为了加强理解,可以查看测试类TestIPC。在那里,规定的参数类型与返回值类型都是LongWritable。
- RPC类是对Server、Client的包装,简化用户的使用。如果一个类需充当服务器,只需通过RPC类的静态方法getServer获得Server实例,然后start。同时此类提供协议接口的实现。如果一个类充当客户端,可以通过getProxy或者waitForProxy获得一个实现了协议接口的proxy object,与服务器端交互。为了加强理解,可以查看测试类TestRPC,在那里,实现的协议接口为TestProtocol。
- 启动Listener进程。如果收到需要建立连接的请求,将建立连接,然后在上面捕获读操作的命令。收到命令之后,将把解析客户端发过来信息的工作委派给Connection。Connection把信息封装到Call对象中,放入队列中,待Handler处理。
- 启动指定数目的Handler线程,处理客户端对指定方法调用的请求,然后把结果返回给客户端。
- 用Call封装好调用信息,然后借助从连接池中取出的Connection向服务器端发送,等待结果。如果到指定服务器的Connection不存在,将马上建立。Connection线程读取服务器方法调用的返回信息。完成之后,通知主线程。
- 对外使用的窗口,隐藏了Server和Client的背后细节,验证RPC协议版本。
在分布式应用程序中使用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是一个不可或缺的名字,它提供了一整套处理大数据的框架。在Hadoop中,远程过程调用(RPC)是核心组件之一,它使得节点间的通信变得高效且可靠。本文将深入探讨...
Hadoop RPC(Remote Procedure Call,远程过程调用)是 Hadoop 项目中的一个重要组件,用于实现分布式系统中的通信和数据交换。下面是对 Hadoop RPC 的详细分析。 RPCInterface Hadoop RPC 的核心是 RPCInterface...
在这个实例中,我们将深入探讨Hadoop RPC的工作原理、客户端(`hadoop_rcp_client`)与服务器端(`hadoop_rpc_server`)的角色以及它们之间的交互过程。 ### Hadoop RPC概述 Hadoop RPC是Hadoop框架中用于进程间...
RPC(RemoteProcedureCall)——远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPCServer实现了一种抽象的RPC服务,同时提供Call队列。RPCServer作为服务提供者由两个...
在IT行业中,分布式计算系统的重要性日益凸显,而Hadoop作为其中的佼佼者,其核心组件之一就是远程过程调用(RPC,Remote Procedure Call)。RPC允许一个程序在某个网络中的计算机上执行另一个计算机上的程序,而...
本文将详细介绍如何使用Hadoop的RPC机制创建一个简单的协议接口、通信服务端和通信客户端程序。这不仅有助于理解分布式系统中的RPC协议,还能深入了解客户机与服务器之间的通信机制。 #### 二、创建RPC通信程序 ##...
这些天一直奔波于长沙和武汉之间,忙着腾讯的笔试、面试,以至于对hadoopRPC(RemoteProcedureCallProtocol,远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。...
在Java中模拟Hadoop的RPC通讯,主要是为了理解其连接和心跳机制,这是保证Hadoop集群稳定运行的关键部分。 RPC的核心思想是透明性,即客户端可以像调用本地方法一样调用远程服务,由RPC框架负责数据的序列化、网络...
标题中的“Hadoop序列化机制”是指Hadoop生态系统中用于数据传输和存储的数据表示方式,它是Hadoop MapReduce和Hadoop Distributed File System (HDFS)等组件之间交换数据的关键技术。序列化是将对象转化为可存储或...
RPC(Remote Procedure Call Protocol,远程过程调用协议)是一种通过网络请求服务的方式,它允许程序调用另一个地址空间中的函数或方法,就像调用本地进程中的函数或方法一样简单。RPC框架主要解决分布式系统中不同...
Hadoop中的RPC机制是基于Java的IPC(Inter-Process Communication)实现的,它在设计时考虑了性能、效率和可控制性,因此与RMI(Remote Method Invocation)等其他RPC方案有所不同。 1. **RPC原理**: Hadoop的RPC...
其中,Hadoop 的远程过程调用(RPC)机制是其核心组件之一,用于实现不同节点之间的高效通信。本文将详细介绍 Hadoop RPC 的基本概念、工作原理以及其实现细节。 #### 二、Hadoop RPC 基本介绍 ##### 2.1 RPC 概念...
Hadoop的RPC机制允许远程节点调用服务,使得分布式环境中不同节点间能够进行高效通信。Spring可以通过配置RPC客户端和服务端,实现对Hadoop服务的调用和暴露。例如,我们可以创建一个Spring Bean来封装Hadoop的...
RPC,即RemoteProcdureCall,中文名:远程过程调用;(1)它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。因此,它经常用于分布式网络通信中。RPC协议...