.RPC(remote procedure call)是hadoop分布式机制运行的基础,远程过程指的是java进程,即一个java进程调用另一个java进程中对象的方法,调用方称作客户端(client),被调用方称作服务端(server),RPC就是CS结构的通信,同样客户端与NameNode通信过程也是采用RPC协议,下面结合实例和源代码进行分析:
1.实例代码: final FSDataOutputStream out= fileSystem.create(new Path(FILE_PATH));//创建文件
2.在上面的create方法中按F3进入源码:
public abstract FSDataOutputStream create(Path f,
FsPermission permission,
boolean overwrite,
int bufferSize,
short replication,
long blockSize,
Progressable progress) throws IOException;
3.从1中的代码可以看出 FSDataOutputStream 是由FileSystem或者其子类产生产生的,这时在控制台输出如下代码:
System.out.println(fileSystem.getClass().getName());
结果为:DistributedFileSystem
4.进入DistributedFileSystem的create()方法:
public FSDataOutputStream create(Path f, FsPermission permission,
boolean overwrite,
int bufferSize, short replication, long blockSize,
Progressable progress) throws IOException {
statistics.incrementWriteOps(1);
return new FSDataOutputStream
(<span style="color:#ff0000;"><strong>dfs.create</strong></span>(getPathName(f), permission,
overwrite, true, replication, blockSize, progress, bufferSize),
statistics);
}
图中dfs代表的是DFSClient,根据RPC机制的原理,顾名思义,此类可能是与NameNode通信的客户端,然后进入DFSClient类
this.rpcNamenode = createRPCNamenode(nameNodeAddr, conf, ugi);
this.namenode = createNamenode(this.rpcNamenode, conf);
从上面图中对DFSClient类的解释,和图中划红线的代码可以看出,DFSClient就是通信的客户端,NameNode是服务端,他们通信的业务类是ClientProtocol。
最后附上最终的截图如下: