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