扩展属性(缩写为 xattrs)是一项文件系统功能,允许用户应用程序将其他元数据与文件或目录关联起来。与文件权限或修改时间等系统级 inode 元数据不同,扩展属性不会被系统解释,而是由应用程序用来存储有关 inode 的其他信息。例如,扩展属性可用于指定纯文本文档的字符编码。
HDFS 中的扩展属性类似于 Linux 中的扩展属性(请参阅 attr(5) 的 Linux 手册页)。扩展属性是 名称-值对,具有字符串名称和二进制值。Xattr 名称还必须以 命名空间为前缀。例如,在 user 命名空间中名为 myXattr 的 xattr 将指定为 user.myXattr。多个 xattr 可以与单个 inode 相关联。
在 HDFS 中,有五个有效的命名空间:user
、trusted
、system
、security
和 raw
。这些命名空间中的每一个都有不同的访问限制。
user
命名空间是客户端应用程序通常会使用的命名空间。对 user 命名空间中扩展属性的访问由相应的文件权限控制。
trusted
命名空间仅对 HDFS 超级用户可用。
system
命名空间保留供内部 HDFS 使用。此命名空间无法通过用户空间方法访问,并且保留用于实现内部 HDFS 功能。
security
命名空间保留供内部 HDFS 使用。此命名空间通常无法通过用户空间方法访问。security
的一种特殊用途是 security.hdfs.unreadable.by.superuser
扩展属性。此 xattr 只能在文件上设置,并且它将阻止超级用户读取文件的内容。超级用户仍然可以读取和修改文件元数据,例如所有者、权限等。假设具有正常的文件系统权限,任何用户都可以设置和访问此 xattr。此 xattr 也是一次性写入的,一旦设置就无法删除。此 xattr 不允许设置值。
raw
命名空间保留供有时需要公开的内部系统属性使用。与 system
命名空间属性一样,它们对用户不可见,除非在 /.reserved/raw
HDFS 目录层次结构中的文件或目录上调用 getXAttr
/getXAttrs
。这些属性只能由超级用户访问。raw
命名空间扩展属性的一个使用示例是 distcp
实用程序。加密区域元数据存储在 raw.*
扩展属性中,因此只要管理员在源和目标中使用 /.reserved/raw
路径名,加密区域中的加密文件就会被透明地复制。
Hadoop shell 支持通过 hadoop fs -getfattr
和 hadoop fs -setfattr
与扩展属性交互。这些命令的样式类似于 Linux getfattr(1) 和 setfattr(1) 命令。
hadoop fs -getfattr [-R] -n name | -d [-e en] <path
>
显示文件或目录的扩展属性名称和值(如果存在)。
-R | 递归地列出所有文件和目录的属性。 |
-n 名称 | 转储命名的扩展属性值。 |
-d | 转储与路径名关联的所有扩展属性值。 |
-e <编码> | 检索值后对值进行编码。有效的编码为“text”、“hex”和“base64”。作为文本字符串编码的值用双引号 (") 括起来,作为十六进制和 base64 编码的值分别以 0x 和 0s 为前缀。 |
<路径> | 文件或目录。 |
hadoop fs -setfattr -n 名称 [-v 值] | -x 名称 <路径
>
为文件或目录设置扩展属性名称和值。
-n 名称 | 扩展属性名称。 |
-v 值 | 扩展属性值。有三种不同的值编码方法。如果参数用双引号括起来,则该值是引号内的字符串。如果参数以 0x 或 0X 为前缀,则将其视为十六进制数。如果参数以 0s 或 0S 开头,则将其视为 base64 编码。 |
-x 名称 | 删除扩展属性。 |
<路径> | 文件或目录。 |
HDFS 开箱即用支持扩展属性,无需额外配置。管理员可能对限制每个 inode 的 xattr 数量和 xattr 大小的选项感兴趣,因为 xattr 会增加 inode 的磁盘和内存空间消耗。
dfs.namenode.xattrs.enabled
是否在 NameNode 上启用对扩展属性的支持。默认情况下,启用扩展属性。
dfs.namenode.fs-limits.max-xattrs-per-inode
每个 inode 的最大扩展属性数。默认情况下,此限制为 32。
dfs.namenode.fs-limits.max-xattr-size
扩展属性的名称和值的最大组合大小(以字节为单位)。默认情况下,此限制为 16384 字节。