首页 > 代码库 > Hadoop FileSystem文件系统的概要学习

Hadoop FileSystem文件系统的概要学习

            在学习Hadoop FileSystem模块之前,最好的建议就是先去学习一下Linux本地文件系统的设计实现,这将会大大的帮助你了解Hadoop FileSystem,至少很多思想都是共通的。其实老实说,Hadoop FileSystem的确是集成了很多文件系统的诸多优点,在设计上还是有非常多值得学习的地方的。这里说的FileSystem可不是就仅仅的是HDFS,HDFS只是他的一个实现。也就是FileSystem是在其上的所有文件系统的一个抽象,的确上特也就是一个抽象类。

FileSystem介绍

在隆重介绍词文件系统之前,得先介绍一个概念,VFS(虚拟文件系统),面对用户的是一系列的函数接口,read().write()等等文件系统中常用的方法,但是用户不知道他使用的到底是哪种文件系统,而最后处理的确实不同的实现子类,可能是子文件系统1,子文件系统2又或者是子文件系统3。所以这就会造成一个虚拟文件系统的概念。这么做的好处就是扩展性非常强,面向接口的模式,如果你又要开发出某一需求下的文件系统,接口统统不用变。下面是一个VFS模型图:


而 Hadoop FileSystem也正是扮演着上面的角色。不过人家系统上的操作还有点带有NFS网络文件系统的味道,因为分布式文件系统的数据要通过网络传输的。下面是我整理的Hadoop FilsSystem庞大的继承实现类的关系,里面被我省去了几个实现的子类。


我们关注几个主要的InMemoryFileSystem内存文件系统,不过上面建议最好不要用了,LocalFileSystem本地文件系统还有第一个ChecksumDistributeFileSystem拥有校验和功能的分布式文件系统。我们说的HDFS的全名类叫DistributedFileSystem,是直接继承FileSystem的,作者把这个类放在了hdfs的包内,并没有在Hadoop Common模块中。

FileSystem包的结构

fs包的结构用下面一张图来概括,由于我所学习的代码版本较早支持的文件系的子类还不是很多,就几个,这个要注意一下:


FileSystem IO输入输出系统

IO的输入输出系统的类的设计至关重要,因为这回关联着后面的各个文件系统所要依赖于此进行操作的,因为涉及的类的确是比较庞杂的,我选择了以类图的形式,最直接明了




输出流的类图:


不知道为什么,输出相关类比输入相关类的东西少,我以为会非常对称的。

FileSystem文件基本描述

在这么庞大的文件系统中,文件的基本表现形式到底是作业的呢,在java,我们都知道是存放在File这个里的了,里面还有各种关于文件操作的诸多方法,在Hadoop系统中,是在一个FileStatu文件状态类;

public class FileStatus implements Writable, Comparable {
  //文件路径,里面包含了URI统一资源标志符
  private Path path;
  //文件长度
  private long length;
  //是否为目录
  private boolean isdir;
  //block副本数
  private short block_replication;
  //block块的大小
  private long blocksize;
  //最后一次文件修改的时间
  private long modification_time;
  //最后文件访问的时间
  private long access_time;
  //文件的读写权限,针对创建者,用户组和其他人
  private FsPermission permission;
  //文件的主人
  private String owner;
  //文件所属组
  private String group;
  .....
里面包含了文件的很多元数据的信息。重点关注2个,Path,和FsPermission,1个管路径,1个管权限:

public class Path implements Comparable {

  /** The directory separator, a slash. */
  public static final String SEPARATOR = "/";
  public static final char SEPARATOR_CHAR = '/';
  
  public static final String CUR_DIR = ".";
  
  static final boolean WINDOWS
    = System.getProperty("os.name").startsWith("Windows");
  //包含了Uri资源统一标识符
  private URI uri;                                // a hierarchical uri
  ...
通过uri的方式去定位文件,下面FsPermission的:

public class FsPermission implements Writable {
  private static final Log LOG = LogFactory.getLog(FsPermission.class);
  ....

  //POSIX permission style
  //对用户,用户组,其他人分别有不同的访问权限 
  private FsAction useraction = null;
  private FsAction groupaction = null;
  private FsAction otheraction = null;
  ....
看到这里,其实他用的文件管理权限的处理跟Linux下的方式是基本一样的,通过对于用户人,用户组,其他人分别有不同的访问权限,通过rwx,3位的方式表示,这个了解Linux文件权限管理的同学一定很熟,就不啰嗦了,

public enum FsAction {
  // POSIX style
  //用3位表示,代表了8种的读写可能性
  NONE("---"),
  EXECUTE("--x"),
  WRITE("-w-"),
  WRITE_EXECUTE("-wx"),
  READ("r--"),
  READ_EXECUTE("r-x"),
  READ_WRITE("rw-"),
  ALL("rwx");
  ....
总结

了解Hadoop FileSystem,主要是要学习的他的设计,力求简洁,具体想要了解里面的文件系统的实现细节,则要选择更深的角度去学习。


Hadoop FileSystem文件系统的概要学习