RPC远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
说明:RPC.getProxy(),该方法有四个参数,第一个参数是被调用的接口类,第二个是客户端版本号,第三个是服务端地址。返回的代理对象,就是服务端对象的代理,内部就是使用ng.Proxy 实现的。
说明:RPC.getServer 方法,该方法有四个参数,第一个参数是被调用的 java对象,第二个参数是服务器的地址,第三个参数是服务器的端口。获得服务器对象后,启动服务器。这样,服务器就在指定端口客户端的请求。
这个接口是供客户端调用的。这里的客户端不是指的自己写的代码,而是hadoop 的一个类叫做 DFSClient。在 DFSClient 中会调用 ClientProtocal 中的方法, 完成一些操作。
在上图中,注意第 185 行的返回值 FSDataOutputStream。这个返回值对象调用了自己的构造方法, 构造方法的第一个参数是 dfs.create()方法。关注一下这里的 dfs 对象是谁,create 方法做了什么事情。现在进入这个方法的实现,如下图所示。
在上图中,可 以 看 到,这 个 类 是 DFSClient 的 内 部 类 。 在 类 内 部 通 过 调用namenode.create()方法创建了一个输出流。再看一下 namenode 对象是什么类型,如下图所示:
继续在 FileSystem 类分析,读数据使用的是 open()方法,可以看到源码,如下图所示。
在上图中,返回的是 DFSClient 类中 DFSDataInputStream 类,显而易见,这是一个内部类。这个内部类的构造函数,有两个形参,第一个参数是 dfs.open()创建的对象。看一下方法的源码,如下图所示。
在上图中,这个构造方法中最重要的语句是第 1834 行,打开信息,从第 1840 行开始是 openInfo()的源代码,截图显示不全。注意第 1841 行,是获取数据块的信息的。查看这一行的源代码,如下图所示。
从上图中可以看到,获取数据块信息的方法也是通过调用 namenode 取得的。这里的 namenode 属性还是位于 DFSClient 中的。通过前面的分析,已经知道,在DFSClient类中的 namenode 属性是 ClientProtocal。
网友评论 ()条 查看