新建了一个Configuration对象之后,在调用Configuration.get()获取配置键值对时,如果Configuration对象的properities为null,就会默认加载CLASSPATH上的默认配置文件(参见 Hadoop源码分析之Configuration),所以在得到一个Configuration对象之后就可以利用这个对象来新建一个FileSystem对象。
Hadoop抽象文件系统
为了为不同的文件系统提供一个统一的接口,Hadoop提供了一个抽象的文件系统,而Hadoop分布式文件系统(Hadoop Distributed File System, HDFS)只是这个抽象文件系统的一个具体实现。Hadoop抽象文件系统接口主要由抽象类org.apache.hadoop.fs.FileSystem提供,其继承的层次结构如下图:
从上图可以看出,Hadoop发行包中包含了不同的FileSystem子类,以满足不同得到数据访问需求。比较典型的是访问HDFS上的数据,但有些时候也可访问存储在其他文件系统上,如Amazon的S3系统。此外,用户还可以根据特定的需求,自己实现特定网络存粗服务的具体文件系统。
Hadoop抽象文件系统为用户提供了一个访问不同的文件系统的统一接口,大部分接口都在FileSystem这个抽象类中。其主要提供的方法可以分为两部分:一部分用于处理文件和目录相关的事务;另一部分用于读写文件数据。其中处理文件和目录主要是指创建文件,创建目录,删除文件,删除目录等操作,读写数据文件主要是指读文件数据,写入文件数据等操作。这一些列操作大部分与Java的文件系统接口相似,如FileSystem.mkdirs(Path f, FsPermission permission)方法在FileSystem对象所代表的文件系统中创建目录,Java.io.File.mkdirs()也是创建目录的方法。FileSystem.delete(Path f)方法用于删除文件或目录,Java.io.File.delete()方法也用于删除文件或目录。FileSystem中需要子类实现的抽象方法大部分都是见名知意的方法,下面整理了FileSystem中的抽象方法:
/**获取文件系统URI**/
public abstract URI getUri();
/**打开一个文件,并返回一个输入流**/
public abstract FSDataInputStream open(Path f, int bufferSize)
throws IOException;
/**创建一个文件,并返回一个输入流**/
public abstract FSDataOutputStream create(Path f,
FsPermission permission,
boolean overwrite,
int bufferSize,
short replication,
long blockSize,
Progressable progress) throws IOException;
/**在一个已经存在的文件中追加数据**/
public abstract FSDataOutputStream append(Path f, int bufferSize,
Progressable progress) throws IOException;
/**修改文件名或目录名**/
public abstract boolean rename(Path src, Path dst) throws IOException;
/**删除文件**/
public abstract boolean delete(Path f, boolean recursive) throws IOException;
/**如果Path是一个目录,读取一个目录下的所有项目和项目属性,如果Path是一个文件获取该文件的属性**/
public abstract FileStatus[