HDFS源码分析——RPC Client实现

2019-03-28 13:25|来源: 网络

通俗来讲RPCRemote Procedure Call)就是调用远程的过程或者方法,既然涉及到远程,必然会有C/S架构,即clientserver。下面首先来看一下Client端的实现。

为实现远程方法调用,最重要的就是跟远程服务器进行连接,然后不断的传输客户端想要调用的方法,包括方法的参数等。为此Client有两个最重要的变量与之一一对应,ConnectionCall。其中,Connection代表与远程服务器之间的连接;Call是一个方法调用的抽象。Connection有一个队列,保存所有需要到该Connection对应的服务器进行调用的方法。因为一个Client可能同时需要到多个服务器进行方法调用,如HDFS一次文件操作,不但需要跟NameNode进行通信,还需要与DataNode进行通信;因此,Client会包含一个Connection的队列。为了区分不同的ConnectionClient定义了另外一个Class ConnectionId来标识不同的连接。

下面我看一下Call的实现,Call具体是比较简单的,如下代码:

private class Call {

int id// call id

Writable param// parameter

Writable value// value, null if error

IOException error// exception, null if value

boolean done// true when call is done

protected Call(Writable param) {

this.param = param;

synchronized (Client.this) {

this.id = counter++;

}

}

......

下面jurisdiction解析一下其不同成员变量的意义,id是在同一个connection上不同方法调用的标识;paramclient传向服务器端的数据,一会具体分析;value是返回结果。其中我们具体分析一下param,在Callparam的具体实现是Class InvocationInvocation具体代表了一个方法,其实现如下:

private static class Invocation implements Writable, Configurable {

private String methodName;

private Class[] parameterClasses;

private Object[] parameters;

private Configuration conf;

......

其中,methodName代表远程调用的方法的名字;parameterClasses代表传入方法参数的类型;parameters代表传入方法参数的值。

如此结合另外一篇文件《Hadoop RPC整个使用流程——以DataNode NameNode注册为例》(见 http://www.linuxidc.com/Linux/2012-09/70999.htm )则整个RPC的过程就比较容易理解了。

相关问答

更多
  • 这是个 序列化异常的问题。你可以查一下自己的代码,是不是实现 Serialization 接口的这个类存在问题。
  • jquery 源码 分析[2022-08-08]

    看完之后对对象和原型的理解帮助会非常大。 但最好等用jquery比较熟悉之后再看源码,那么会对理解比较有好处,也会比较容易看懂。 最好从jquery核心处开始看,看懂$.fn.init以及基本方法之后再看别的$.extend的时候就比较容易了。
  • 关于内核的书不在多,而是要精,强烈推荐 《Linux内核设计与实现》,英文名Linux Kernel Development,机械工业出版社,¥35, 美国Robert Love著,陈莉君译。 此书是当今首屈一指的入门最佳图书。作者是为2.6内核加入了抢占的人,对调度部分非常精通,而调度是整个系统的核心,因此本书是很权威的。对没怎么深入内核的人来说,这是强烈推荐的一本书。
  • 安装部署 获取calamari相关代码 # git clone https://github.com/ceph/calamari.git # git clone https://github.com/ceph/calamari-clients.git # git clone https://github.com/ceph/Diamond 生成calamari-server安装包 # yum install gcc gcc-c++ postgresql-libs python-virtualenv # cd ...
  • Windows有它自己的RPC版本。 它仅在Windows盒子之间正常工作。 为了互操作性,您需要查看CORBA或WCF。 Windows has its own version of RPC. It works fine between Windows boxes only. For interoperability you need to look at CORBA or WCF.
  • 要获取RPC客户端的进程名称,必须使用RpcServerInqCallAttributes查询进程ID,使用进程ID获取进程句柄的OpenProcess ,以及使用进程句柄获取完整进程名称的QueryFullProcessImageName 。 To get the process name for an RPC client, you must use RpcServerInqCallAttributes to query the process ID, OpenProcess with the proc ...
  • 打开www.google.com 写“下载javax.xml.rpc库” 下载jar文件。 将jar文件放在eclipse的plugin文件夹中。 右键单击您的java项目 - >构建路径 - >添加库 - >从插件文件夹中浏览jar。 open www.google.com write "download javax.xml.rpc library" download jar file. Place the jar file in plugin folder of eclipse. Right click ...
  • JSON :: RPC :: Client由旧版本的JSON-RPC提供 。 JSON-RPC版本1.00突破了与先前版本的兼容性,不再包含该模块。 您必须安装旧版本才能使此代码正常工作(或更新代码以使用新API)。 你可以在这里获得JSON-RPC 0.96(最后一个兼容版本) 。 您可以将旧版本安装在私有位置,仅用于此代码。 JSON::RPC::Client was provided by an older version of JSON-RPC. Version 1.00 of JSON-RPC b ...
  • 您可以使用socket.setTimeout()方法。 from thrift.transport.THttpClient import THttpClient socket = THttpClient(server_url) socket.setTimeout(SERVICE_TIMEOUT_IN_mS) transport = TTransport.TBufferedTransport(socket) protocol = TBinaryProtocol.TBinaryProtocol(transpor ...
  • 好的,所以我需要在我的代码中进行的实际修复如下: 传入的args需要是自定义类型,因此您可以导出它,并且需要导出该类型中的字段本身... type Args struct { Foo string Bar string } 但更重要的是,在Ruby方面,您需要以满足此要求的格式发送JSON - > https://golang.org/src/net/rpc/jsonrpc/client.go#L45 < - happy 这样做...... b = { :method => "Comp ...