拡張属性(xattrsと略記)は、ユーザーアプリケーションがファイルまたはディレクトリに追加のメタデータを関連付けることを可能にするファイルシステム機能です。ファイルパーミッションや変更時刻などのシステムレベルのinodeメタデータとは異なり、拡張属性はシステムによって解釈されず、代わりにアプリケーションによってinodeに関する追加情報を格納するために使用されます。拡張属性は、たとえば、プレーンテキストドキュメントの文字エンコーディングを指定するために使用できます。
HDFSの拡張属性は、Linuxの拡張属性をモデルにしています(attr(5)のLinuxマニュアルページを参照)。拡張属性は、文字列名とバイナリ値を持つ名前と値のペアです。 xattrs名は、名前空間でプレフィックスされる必要があります。たとえば、user名前空間のmyXattrという名前のxattrは、user.myXattrとして指定されます。複数のxattrを単一のinodeに関連付けることができます。
HDFSでは、user
、trusted
、system
、security
、およびraw
の5つの有効な名前空間があります。これらの名前空間には、それぞれ異なるアクセス制限があります。
user
名前空間は、クライアントアプリケーションで一般的に使用される名前空間です。ユーザー名前空間の拡張属性へのアクセスは、対応するファイルパーミッションによって制御されます。
trusted
名前空間は、HDFSスーパーユーザーのみが使用できます。
system
名前空間は、HDFS内部で使用するために予約されています。この名前空間は、ユーザー空間メソッドを介してアクセスできず、HDFSの内部機能を実装するために予約されています。
security
名前空間は、HDFS内部で使用するために予約されています。この名前空間は、一般的にユーザー空間メソッドを介してアクセスできません。 security
の具体的な用途の1つは、security.hdfs.unreadable.by.superuser
拡張属性です。このxattrはファイルにのみ設定でき、スーパーユーザーがファイルの内容を読み取るのを防ぎます。スーパーユーザーは、所有者、パーミッションなど、ファイルメタデータを読み取って変更できます。このxattrは、通常のファイルシステムパーミッションを想定して、任意のユーザーが設定およびアクセスできます。このxattrは書き込み専用であり、一度設定すると削除できません。このxattrでは、値を設定できません。
raw
名前空間は、公開する必要がある内部システム属性用に予約されています。 system
名前空間属性と同様に、getXAttr
/ getXAttrs
が/.reserved/raw
HDFSディレクトリ階層内のファイルまたはディレクトリで呼び出された場合を除き、ユーザーには表示されません。これらの属性には、スーパーユーザーのみがアクセスできます。 raw
名前空間拡張属性が使用される例は、distcp
ユーティリティです。暗号化ゾーンメタデータはraw.*
拡張属性に格納されるため、管理者がソースとターゲットで/.reserved/raw
パス名を使用する限り、暗号化ゾーン内の暗号化されたファイルは透過的にコピーされます。
Hadoopシェルは、hadoop fs -getfattr
およびhadoop fs -setfattr
を介して拡張属性を操作するためのサポートを提供しています。これらのコマンドは、Linuxのgetfattr(1)およびsetfattr(1)コマンドをモデルにしています。
hadoop fs -getfattr [-R] -n name | -d [-e en] <path>
>
ファイルまたはディレクトリの拡張属性の名前と値(存在する場合)を表示します。
-R | すべてのファイルとディレクトリの属性を再帰的にリストします。 |
-n name | 指定された拡張属性値をダンプします。 |
-d | パス名に関連付けられているすべての拡張属性値をダンプします。 |
-e <encoding> | 値を取得した後にエンコードします。有効なエンコーディングは、「text」、「hex」、および「base64」です。テキスト文字列としてエンコードされた値は二重引用符( "")で囲まれ、16進数およびbase64としてエンコードされた値には、それぞれ0xおよび0sというプレフィックスが付きます。 |
<path> | ファイルまたはディレクトリ。 |
hadoop fs -setfattr -n name [-v value] | -x name <path>
>
ファイルまたはディレクトリの拡張属性の名前と値を設定します。
-n name | -n name |
拡張属性名。 | -v value |
拡張属性値。値には3つの異なるエンコード方法があります。引数が二重引用符で囲まれている場合、値は引用符で囲まれた文字列です。引数のプレフィックスが0xまたは0Xの場合、16進数として扱われます。引数が0sまたは0Sで始まる場合、base64エンコーディングとして扱われます。 | -x name |
<path> | ファイルまたはディレクトリ。 |
HDFSは、追加の構成なしで、すぐに拡張属性をサポートします。 xattrsはinodeのディスク上およびメモリ内のスペース消費量を増やすため、管理者は、inodeあたりのxattrsの数とxattrsのサイズを制限するオプションに興味があるかもしれません。
dfs.namenode.xattrs.enabled
NameNodeで拡張属性のサポートが有効になっているかどうか。デフォルトでは、拡張属性は有効になっています。
dfs.namenode.fs-limits.max-xattrs-per-inode
inodeあたりの拡張属性の最大数。デフォルトでは、この制限は32です。
dfs.namenode.fs-limits.max-xattr-size