Hadoop中针对create方法,实现获取文件的xattr(一)

Hadoop中针对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.txt101在某个非根目录找到xattr
/test0/1.txt101在根目录找到xattr
/1.txt111在根目录找到xattr
/test0/1.txt101遍历整个父目录找不到xattr
/1.txt111遍历整个父目录找不到xattr
/test3/1.txt100在根目录找到xattr
/test0/mkdirs/1.txt100遍历整个父目录找不到xattr
/test3/mkdirs/1.txt100遍历整个父目录找不到xattr
1.txt 实际为/user/cephlee/1.txt101在某个非根目录找到xattr
1.txt 实际为/user/cephlee/1.txt101在根目录找到xattr
1.txt 实际为/user/cephlee/1.txt101遍历整个父目录找不到xattr
1.txt 实际为/user/cephlee/1.txt100在根目录找到xattr
1.txt 实际为/user/cephlee/1.txt100遍历整个父目录找不到xattr

① 对 /test/mkdirs/1.txt的测试

序号path有父目录父目录为根目录父目录存在期望存在xattr的目录
/test/mkdirs/1.txt101在某个非根目录找到xattr
  • 目录层次分析
path父目录是否存在xattr
/test/mkdirs/1.txt/test/mkdirsfalse
/test/mkdirs/testfalse
/test/true
  • 期待的测试结果
返回值打印值
true/test的xattr存在
  • 实际调用路线图

这里写图片描述

  • 实际运行结果
    这里写图片描述

② 对 /test0/1.txt的测试

序号path有父目录父目录为根目录父目录存在期望存在xattr的目录
/test0/1.txt101在根目录找到xattr
  • 目录层次分析
path父目录是否存在xattr
/test0/1.txt/test0false
/test0/true
  • 期待的测试结果
返回值打印值
true/ 的xattr存在
  • 实际调用路线图
    这里写图片描述

  • 实际运行结果
    这里写图片描述

③ 对 /1.txt的测试

序号path有父目录父目录为根目录父目录存在期望存在xattr的目录
/1.txt111在根目录找到xattr
  • 目录层次分析
path父目录是否存在xattr
/1.txt/true
  • 期待的测试结果
返回值打印值
true/ 的xattr存在
  • 实际调用路线图
    这里写图片描述

  • 实际运行结果
    这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值