zoukankan      html  css  js  c++  java
  • 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,主要是要学习的他的设计,力求简洁,具体想要了解里面的文件系统的实现细节,则要选择更深的角度去学习。


  • 相关阅读:
    PATA 1071 Speech Patterns.
    PATA 1027 Colors In Mars
    PATB 1038. 统计同成绩学生(20)
    1036. 跟奥巴马一起编程(15)
    PATA 1036. Boys vs Girls (25)
    PATA 1006. Sign In and Sign Out (25)
    读取web工程目录之外的图片并显示
    DOS命令
    java连接oracle集群
    servlet
  • 原文地址:https://www.cnblogs.com/bianqi/p/12184119.html
Copyright © 2011-2022 走看看