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


  • 相关阅读:
    LeetCode: Text Justification 解题报告
    LeetCode: Evaluate Reverse Polish Notation 解题报告
    telnet服务搭建
    CentOS 7 快速部署 ELK
    CSVN配置自动备份策略
    使用mysqlproxy实现mysql读写分离
    linux挂载windows共享文件夹
    Centos7.3使用花生壳映射端口
    rpm使用
    linux运维注意事项
  • 原文地址:https://www.cnblogs.com/bianqi/p/12184120.html
Copyright © 2020-2023  润新知