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文件系统的概要学习

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

Hadoop FileSystem文件系统的概要学习

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

FileSystem包的结构

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

Hadoop FileSystem文件系统的概要学习

FileSystem IO输入输出系统

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

Hadoop FileSystem文件系统的概要学习

输出流的类图:

Hadoop FileSystem文件系统的概要学习

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

FileSystem文件基本描述

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

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

相关推荐