【精】彻底熟悉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的传播探险过程,如下图所示。
淡蓝色大长方形代表类,深蓝色小长方形代表类里的字段。箭头指向字段的真实类型。

上一篇 下一篇

猜你喜欢

热点阅读