HDFS 中的扩展属性

概述

扩展属性(缩写为 xattrs)是一项文件系统功能,允许用户应用程序将其他元数据与文件或目录关联起来。与文件权限或修改时间等系统级 inode 元数据不同,扩展属性不会被系统解释,而是由应用程序用来存储有关 inode 的其他信息。例如,扩展属性可用于指定纯文本文档的字符编码。

HDFS 扩展属性

HDFS 中的扩展属性类似于 Linux 中的扩展属性(请参阅 attr(5) 的 Linux 手册页)。扩展属性是 名称-值对,具有字符串名称和二进制值。Xattr 名称还必须以 命名空间为前缀。例如,在 user 命名空间中名为 myXattr 的 xattr 将指定为 user.myXattr。多个 xattr 可以与单个 inode 相关联。

命名空间和权限

在 HDFS 中,有五个有效的命名空间:usertrustedsystemsecurityraw。这些命名空间中的每一个都有不同的访问限制。

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 -getfattrhadoop fs -setfattr 与扩展属性交互。这些命令的样式类似于 Linux getfattr(1)setfattr(1) 命令。

getfattr

hadoop fs -getfattr [-R] -n name | -d [-e en] <path>

显示文件或目录的扩展属性名称和值(如果存在)。

-R 递归地列出所有文件和目录的属性。
-n 名称 转储命名的扩展属性值。
-d 转储与路径名关联的所有扩展属性值。
-e <编码> 检索值后对值进行编码。有效的编码为“text”、“hex”和“base64”。作为文本字符串编码的值用双引号 (") 括起来,作为十六进制和 base64 编码的值分别以 0x 和 0s 为前缀。
<路径> 文件或目录。

setfattr

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 字节。