【精】彻底熟悉Hadoop RPC框架
2022-02-14 本文已影响0人
大数据Zone
学习HDFS绕不开的一个重要的知识点就是Hadoop RPC框架。但是能将RPC框架从客户端->服务端,再从服务端到客户端这一套通信脉络顺着讲明白的资料很少。不少都是给出各个类的定义啊,调用了什么方法啊,很难让读者直观的理解Hadoop RPC框架。因此决定写这样一篇文章,我觉得只要认真读这篇文章,同时跟着本文的流程走一遍,掌握Hadoop RPC框架绝对是不在话下。
本文通过流程图+文字详细的介绍了Hadoop RPC框架。本文首先从DFSClient出发,追踪一个RPC请求的传播路径,以此对Hadoop RPC框架有个初步的了解。然后力图以先整体再局部的方式详细介绍Hadoop RPC框架。
本文涉及到的预备知识有:
静态内部类的用法、动态代理设计模式
RPC调用链路
当我们使用HDFS API进行编程或者HDFS CLI命令行输入命令执行时,内部会通过调用DFSClient的相关方法来实现。以HDFS API的使用为例:
①使用HDFS文件系统API前,先得到一个FileSystem对象。
②调用FileSystem对象中的方法。
// ①使用HDFS文件系统API前,先得到一个FileSystem对象。
public static FileSystem getFileSystem(String coreSitePath, String hdfsSitePath) throws IOException {
Configuration conf = new Configuration();
conf.addResource(new File(coreSitePath).toURI().toURL());
conf.addResource(new File(hdfsSitePath).toURI().toURL());
conf.set("fs.file.impl", org.apache.hadoop.fs.LocalFileSystem.class.getName());
conf.set("fs.hdfs.impl", org.apache.hadoop.hdfs.DistributedFileSystem.class.getName());
conf.setBoolean("fs.hdfs.impl.disable.cache", true);
conf.setClassLoader(BaseUtil.class.getClassLoader());
return FileSystem.get(conf);
}
// ②调用FileSystem对象中的方法。
FileSystem fileSystem = getFileSystem(coreSitePath, hdfsSitePath);
ContentSummary contentSummary = fileSystem.getContentSummary(new Path(hdfsFilePath));
代码里的FileSystem的实际类型其实是DistributedFileSystem,观察DistributedFileSystem类的源码,里面持有了一个DFSClient对象dfs,如下图:
当调用FileSystem类的方法时,其实是调用了DFSClient的方法,如下图:
那我们就从DFSClient类开始,描述一个RPC的传播探险过程,如下图所示。
淡蓝色大长方形代表类,深蓝色小长方形代表类里的字段。箭头指向字段的真实类型。