针对create方法,实现获取文件的xattr(一)
① 目前实现的压缩功能,针对所有文件读写时都会采用,这样无法实现个性化定制。希望通过将压缩要求写入xattr:<user.zip,true>
,在create
时读取对应的xattr,通过xattr的值来判断是否对文件进行压缩写入。
② 由于create
采用overwrite
的方式新建文件,以前如果存在相同的文件并且具有xattr,新建以后,以前文件所有属性都会清除。所以create
的文件是没有xattr的。
③ 这时需要该文件继承直接父目录的xattr属性;如果直接父目录没有,需要往更上层父目录遍历获取xattr属性,直至根目录"/"
。
④ 针对以上问题,首先需要知道新建文件时,该文件的fullPath是怎么样,方便我们递归遍历其父目录。
1. 对create()文件的path测试
① 文件名为1.txt
时,对应的Path
FileStatus status=dfs.getFileStatus(new Path("1.txt"));
System.out.println(status.toString());
/*FileStatus{path=hdfs://192.168.202.34/user/cephlee/1.txt;
* isDirectory=false; length=726; replication=3;
* blocksize=134217728; modification_time=1533215459323;
* access_time=1533215459079; owner=cephlee;
* group=supergroup; permission=rw-r--r--; isSymlink=false}
* */
注意:这里的cephlee
对应的是连接hdfs时,设置的HADOOP_USER_NAME
。如果直接使用主机访问,则HADOOP_USER_NAME
应该为本机的hostname:lucy
。
/*FileStatus{path=hdfs://192.168.202.34/user/lucy/1.txt;
* isDirectory=false; length=726; replication=3;
* blocksize=134217728;modification_time=1533220688303;
* access_time=1533220687997; owner=lucy; group=supergroup;
* permission=rw-r--r--; isSymlink=false}*/
可以通过以下代码设置HADOOP_USER_NAME
:
System.setProperty("HADOOP_USER_NAME", "cephlee");
注意:所有文件都是位于根目录下,如果创建时不带根目录,则位于/user/cephlee
下;可以把/user/lucy
看做Ubuntu系统的/home/lucy
。hdfs的文件系统的目录结构,跟Ubuntu的文件系统目录结构是一样的。
Ubuntu系统的目录树如下:
② 文件名为/1.txt
时,对应的Path
FileStatus status=dfs.getFileStatus(new Path("/1.txt"));
System.out.println(status.toString());
/*FileStatus{path=hdfs://192.168.202.34/1.txt;
* isDirectory=false; length=726; replication=3;
* blocksize=134217728; modification_time=1533215556166;
* access_time=1533215555805; owner=cephlee; group=supergroup;
* permission=rw-r--r--; isSymlink=false}
* */
③文件名为/test/1.txt
时,对应的Path
FileStatus status=dfs.getFileStatus(new Path("/test/1.txt"));
System.out.println(status.toString());
/*FileStatus{path=hdfs://192.168.202.34/test/1.txt;
* isDirectory=false; length=4096; replication=2;
* blocksize=134217728; modification_time=1532422840511;
* access_time=1533187356820; owner=lucy; group=supergroup;
* permission=rwxrwxrwx; isSymlink=false}
* */
2. 为父目录设置xattr
知道create对应的path之后,分别为他们的父目录设置xattr
① 设置/1.txt
的父目录的xattr
byte[] value=("true").getBytes("utf-8");
dfs.setXAttr(new Path("/"), "user.zip", value);
查询结果:
② 设置/test/1.txt
的父目录的xattr
byte[] value=("true").getBytes("utf-8");
dfs.setXAttr(new Path("/test"), "user.zip", value);
③ 设置1.txt
的父目录的xattr
//通过System.getProperty获取HADOOP_USER_NAME
String user=System.getProperty("HADOOP_USER_NAME");
/*如果之前没有通过System.setProperty设置HADOOP_USER_NAME,则会返回null。
这时的HADOOP_USER_NAME应该为本机的hostname*/
if (user==null) {
InetAddress ia = InetAddress.getLocalHost();
user=ia.getHostName();//获取计算机主机名
}
System.out.println(user);
//设置"1.txt" 的父目录的xattr
byte[] value=("true").getBytes("utf-8");
dfs.setXAttr(new Path("/user/"+user), "user.zip", value);
3. 测试不同情况下xattr的获取情况
根据create时,path的三种情况,分别测试以下测试用例:
序号 | path | 有父目录 | 父目录为根目录 | 父目录存在 | 期望存在xattr的目录 |
---|---|---|---|---|---|
① | /test/mkdirs/1.txt |
1 | 0 | 1 | 在某个非根目录找到xattr |
② | /test0/1.txt |
1 | 0 | 1 | 在根目录找到xattr |
③ | /1.txt |
1 | 1 | 1 | 在根目录找到xattr |
④ | /test0/1.txt |
1 | 0 | 1 | 遍历整个父目录找不到xattr |
⑤ | /1.txt |
1 | 1 | 1 | 遍历整个父目录找不到xattr |
⑥ | /test3/1.txt |
1 | 0 | 0 | 在根目录找到xattr |
⑦ | /test0/mkdirs/1.txt |
1 | 0 | 0 | 遍历整个父目录找不到xattr |
⑧ | /test3/mkdirs/1.txt |
1 | 0 | 0 | 遍历整个父目录找不到xattr |
⑨ | 1.txt 实际为/user/cephlee/1.txt |
1 | 0 | 1 | 在某个非根目录找到xattr |
⑩ | 1.txt 实际为/user/cephlee/1.txt |
1 | 0 | 1 | 在根目录找到xattr |
⑪ | 1.txt 实际为/user/cephlee/1.txt |
1 | 0 | 1 | 遍历整个父目录找不到xattr |
⑫ | 1.txt 实际为/user/cephlee/1.txt |
1 | 0 | 0 | 在根目录找到xattr |
⑬ | 1.txt 实际为/user/cephlee/1.txt |
1 | 0 | 0 | 遍历整个父目录找不到xattr |
① 对 /test/mkdirs/1.txt
的测试
序号 | path | 有父目录 | 父目录为根目录 | 父目录存在 | 期望存在xattr的目录 |
---|---|---|---|---|---|
① | /test/mkdirs/1.txt |
1 | 0 | 1 | 在某个非根目录找到xattr |
- 目录层次分析
path | 父目录 | 是否存在xattr |
---|---|---|
/test/mkdirs/1.txt | /test/mkdirs | false |
/test/mkdirs | /test | false |
/test | / | true |
- 期待的测试结果
返回值 | 打印值 |
---|---|
true | /test的xattr存在 |
- 实际调用路线图
- 实际运行结果
② 对 /test0/1.txt
的测试
序号 | path | 有父目录 | 父目录为根目录 | 父目录存在 | 期望存在xattr的目录 |
---|---|---|---|---|---|
② | /test0/1.txt |
1 | 0 | 1 | 在根目录找到xattr |
- 目录层次分析
path | 父目录 | 是否存在xattr |
---|---|---|
/test0/1.txt | /test0 | false |
/test0 | / | true |
- 期待的测试结果
返回值 | 打印值 |
---|---|
true | / 的xattr存在 |
实际调用路线图
实际运行结果
③ 对 /1.txt
的测试
序号 | path | 有父目录 | 父目录为根目录 | 父目录存在 | 期望存在xattr的目录 |
---|---|---|---|---|---|
③ | /1.txt |
1 | 1 | 1 | 在根目录找到xattr |
- 目录层次分析
path | 父目录 | 是否存在xattr |
---|---|---|
/1.txt | / | true |
- 期待的测试结果
返回值 | 打印值 |
---|---|
true | / 的xattr存在 |
实际调用路线图
实际运行结果