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 name 傾印指定的延伸屬性值。
-d 傾印與路徑名稱相關聯的所有延伸屬性值。
-e <encoding> 擷取值後對其進行編碼。有效的編碼為「text」、「hex」和「base64」。以文字字串編碼的值會用雙引號 (") 括起來,而以十六進位和 base64 編碼的值則分別以 0x 和 0s 為字首。
<path> 檔案或目錄。

setfattr

hadoop fs -setfattr -n name [-v value] | -x name <path>

設定檔案或目錄的延伸屬性名稱和值。

-n name 延伸屬性名稱。
-v value 延伸屬性值。有三個不同的值編碼方法。如果參數用雙引號括起來,則值為引號內的字串。如果參數以 0x 或 0X 為字首,則視為十六進位數字。如果參數以 0s 或 0S 開頭,則視為 base64 編碼。
-x name 移除延伸屬性。
<path> 檔案或目錄。

組態選項

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 位元組。