HDFS 杂谈:Xattrs 扩展属性
HDFS xattrs 介绍
HDFS 对象一般具备以下元数据:名称、路径、用户、用户组、权限模型、占用空间、创建时间、修改时间、访问时间。通过阅读上述元数据,可以对 HDFS 对象具备初步的了解。但是,当想了解更多的对象信息,比如对象内容、字符编码、记录数等信息时,就不得不打开对象或通过别的文件系统的指令来了解。有没有方法可以把额外的对象信息存储在对象内并允许直接访问,但又不影响自身的元数据信息呢?这就引出 HDFS 对象的 extended attributes(简称为 xattrs)扩展属性了。
HDFS xattrs 来源于 linux xattrs,属于 HDFS 对象自定义的元数据信息。与诸如文件权限或修改时间之类的系统级 inode 元数据不同,xattrs 不会被系统解析,因为 xattrs 是自身 inode 所关联的额外信息。
HDFS xattrs 一般以键值对的方式存储,具有字符串名称及对应的二进制值(xattrs 可以只有名称而不设置对应值)。每个对象的 inode 可以关联多个 xattrs。
xattrs 的名称必须以命名空间作为前缀才能生效,但并非所有的命名空间都可被用户使用,接下来将介绍 xattrs 的命名空间。
xattrs 命名空间及权限
HDFS xattrs 具有 5 个有效的命名空间,分别为 user,trust,system,security 和 raw。这些命名空间均具有不同的访问限制。
user 命名空间,是基本用户均可使用的命名空间,一般设置 xattrs 都使用该命名空间。user 命名空间的 xattrs 的访问由相应对象的权限控制。
trust 命名空间只对 HDFS 超级用户开放。
system 命名空间是保留给 HDFS 系统所使用,普通用户一般无法访问。
security 命名空间也是保留给 HDFS 系统所使用,普通用户一般无法访问。security 命名空间的一种特殊用法是设置 security.hdfs.unread.by.superuser 的 xattrs。该 xattr 只能在文件上设置,并阻止超级用户读取文件的内容,但超级用户仍然可以读取和修改该文件的系统级元数据。任意用户都可以对文件设置这类特殊的扩展属性,但该 xattr 是一次写入的,一旦设置就无法删除与更改。
raw 命名空间主要作用是显露需显露的系统属性。与 system 命名空间一样,普通用户一般无法访问。除非在/.reserved/raw 目录或目录内的对象调用 getXAttr / getXAttrs 指令,且只有超级用户才能访问该命名空间的 xattrs。
xattrs 的设置及访问指令
HDFS xattrs 的设置及访问指令分别为 setfattr 及 getfattr,具体使用方式可访问《Hadoop编程实战:HDFS用户Shell详解》。
比如对/hdfstest/test.txt 设置扩展属性 user.MyAttr,并赋值 MyValue,其执行方式为:
xattrs 在 HDFS 的配置参数
dfs.namenode.xattrs.enabled
开启 HDFS xattrs 功能,默认 HDFS 是开启该功能。
dfs.namenode.fs-limits.max-xattrs-per-inode
每个对象的 inode 最多可关联的 xattrs 数,默认值为 32 个.
dfs.namenode.fs-limits.max-xattr-size
每个 xattrs 的最大长度,默认值为 16384 bytes(16 kb)。
总结
HDFS xattrs 是 HDFS 对象可自定义的元数据信息,被对象的 inode 所关联,所以与系统级 inode 元数据不一致,不会被系统解析。访问与设置 xattrs 依靠 HDFS SHELL 的 setfattr 与 getfattr 指令;
xattrs 以键值对的方式存储,表现形式为字符串名称与二进制数值。xattrs 名称必须以命名空间作为前缀才能生效;
HDFS xattrs 具有 5 个有效的命名空间,分别为 user,trust,system,security 和 raw,基础用户可使用 user 命名空间来设置及访问 xattrs。
版权声明: 本文为 InfoQ 作者【罗小龙】的原创文章。
原文链接:【http://xie.infoq.cn/article/dc898e0ece2c25e7c4cf112a0】。文章转载请联系作者。
评论