DistributedFileSystem这个类在包package org.apache.hadoop.hdfs中,为用户开发基于HDFS的应用程序提供了API,这个类有几个成员变量:
private Path workingDir;
private URI uri;
private String homeDirPrefix = DFSConfigKeys.DFS_USER_HOME_DIR_PREFIX_DEFAULT;
DFSClient dfs;
private boolean verifyChecksum = true;
DistributedFileSystem类的继承关系如下:
既然DistributedFileSystem类是用来对开发人员提供api接口服务的,那么开发人员该如何去使用它呢?我们看一下下面的例子:
//读取配置文件
Configuration conf = new Configuration();
//获取文件系统
FileSystem fs = FileSystem.get(URI.create("hdfs://hadoop1:9000"),conf);
Path srcPath = new Path(path);
//调用mkdir()创建目录,(可以一次性创建,以及不存在的父目录)
boolean flag = fs.mkdirs(srcPath);
if(flag) {
System.out.println("create dir ok!");
}else {
System.out.println("create dir failure");
}
//关闭文件系统
fs.close();
我们发现,例子中直接使用了DistributedFileSystem父类FileSystem,而没有使用DistributedFileSystem,这个是为什么呢?接下来我们到FileSystem类的get方法中:
/** Returns the FileSystem for this URI's scheme and authority. The scheme
* of the URI determines a configuration property name,
* <tt>fs.<i>scheme</i>.class</tt> whose value names the FileSystem class.
* The entire URI is passed to the FileSystem instance's initialize method.
*/
public static FileSystem get(URI uri, Configuration conf) throws IOException {
//uri是hdfs文件的路径
//下面用到了URI类,关于这个类的使用,可以到https://blog.csdn.net/weixin_39935887/article/details/81432814和https://www.jianshu.com/p/58b9245a6f16中了解详情
String scheme = uri.getScheme();//获取一个url中的协议,比如https或者http等
String authority = uri.getAuthority();
if (scheme == null && authority == null) { // use default FS
return get(conf);//如果协议和域名都为null,那么就采用默认的FS
}
if (scheme != null && a