擴充屬性(簡寫為xattrs)是一個檔案系統的特性,它允許使用者程式用一個檔案或目錄關聯額外的中繼資料。不同于系統級的inode中繼資料比如權限或修改時間,擴充屬性不會被系統解釋,它是用來被應用程式解讀并存儲inode額外資訊的。擴充屬性用來存儲比如一個文本文檔的編碼資訊。
hdfs的擴充屬性是依照linux的擴充屬性來模組化的(參見linux幫助手冊attr(5)和相關文檔)。一個擴充屬性就是一個名值對,包含一個字元串名字和一個二進制值。擴充屬性名必須依照一個特定的命名空間字首命名。比如,一個叫做myxattr的屬性名必須聲明為user.myxattr,這說明在user的命名空間下。多個擴充屬性可以關聯同一個inode。
hdfs包含5個合理的命名空間:user, trusted, system, security, 和 raw。每個命名空間擁有不同的通路限制。
user命名空間是被用戶端應用程式使用的命名空間。在user命名空間通路擴充屬性被對應的檔案權限來控制通路。
trusted命名空間隻對hdfs的超級使用者有效。
system命名空間是保留給hdfs内部使用的。該命名空間不能通過使用者級别的方法通路到,隻被用來實作hdfs内部的feature。
security命名空間也是保留給hdfs内部使用的。該命名空間不能通過使用者級别的方法通路。security的一個特定的使用時擴充屬性security.hdfs.unreadable.by.superuser。這個屬性隻能設定到檔案上,它可以禁止超級使用者來讀取檔案内容。超級使用者可以讀取和修改檔案的中繼資料,比如owner,權限等。這個擴充屬性可以被任何擁有普松檔案系統權限的使用者設定和通路。該屬性是write-once的,一旦被設定将不能被删除。該屬性不允許設定值。
raw命名空間是内部系統保留的命名空間,但是有時會暴露給外部。除非一個在/.reserved/raw目錄下的檔案被getxattr/getxattrs調用,否則raw命名空間像其他系統級命名空間一樣不被外部使用者通路。這些屬性隻能被超級使用者通路。一個raw命名空間擴充屬性使用的案例就是distcp。加密區域的中繼資料存儲在raw.*的擴充屬性裡,隻要管理者使用/.reserved/raw路徑作為源或者目标,在加密域中的加密檔案會被透明的複制。
hadoop shell支援擴充屬性的互動,通過<code>hadoop fs -getfattr</code>名令和<code>hadoop fs -setfattr</code>指令。這些明星類似linux的 getfattr(1) 和 setfattr(1)。
顯示一個檔案或者目錄的擴充屬性名和值。
參數
描述
<code>-r</code>
遞歸顯示所有目錄和檔案的擴充屬性。
<code>-n name</code>
dump指定名字的擴充屬性值。
<code>-d</code>
dump指定路徑的所有擴充屬性值。
<code>-e <encoding></code>
查詢屬性值後對其encode。合法的編碼包括:"text", "hex", 和 "base64"。被編碼的字元串會被雙引号包圍,被編碼為16進制和base64的會有個字首0x和0s。
<code><path></code>
檔案或者目錄。
為一個目錄或者檔案設定一個擴充屬性。
擴充屬性名
<code>-v value</code>
擴充屬性值。有三種不同的編碼方法。如果參數被包圍在雙引号内,則值是普通字元串類型。如果以0x或者0x開頭,那麼值是16進制數字。如果以0s或者0s開頭,則值是base64編碼的串。
<code>-x name</code>
删除擴充屬性。
hdfs支援在配置之外使用擴充屬性。因為擴充屬性會增加inode的磁盤和記憶體空間的消耗,管理者可能會限制每個inode的擴充屬性數量和大小。
dfs.namenode.xattrs.enabled
在namenode上是否支援擴充尚需經。預設情況擴充屬性是enable的。
dfs.namenode.fs-limits.max-xattrs-per-inode
每個inode支援的最大擴充屬性數。預設值是32。
dfs.namenode.fs-limits.max-xattr-size
一個擴充屬性的名和值的組合最大位元組數。預設情況,上限是16384位元組。