HDFSにおける拡張属性

概要

拡張属性xattrsと略記)は、ユーザーアプリケーションがファイルまたはディレクトリに追加のメタデータを関連付けることを可能にするファイルシステム機能です。ファイルパーミッションや変更時刻などのシステムレベルのinodeメタデータとは異なり、拡張属性はシステムによって解釈されず、代わりにアプリケーションによってinodeに関する追加情報を格納するために使用されます。拡張属性は、たとえば、プレーンテキストドキュメントの文字エンコーディングを指定するために使用できます。

HDFS拡張属性

HDFSの拡張属性は、Linuxの拡張属性をモデルにしています(attr(5)のLinuxマニュアルページを参照)。拡張属性は、文字列名とバイナリ値を持つ名前と値のペアです。 xattrs名は、名前空間でプレフィックスされる必要があります。たとえば、user名前空間のmyXattrという名前のxattrは、user.myXattrとして指定されます。複数のxattrを単一のinodeに関連付けることができます。

名前空間とパーミッション

HDFSでは、usertrustedsystemsecurity、および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)コマンドをモデルにしています。

getfattr

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

ファイルまたはディレクトリの拡張属性の名前と値(存在する場合)を表示します。

-R すべてのファイルとディレクトリの属性を再帰的にリストします。
-n name 指定された拡張属性値をダンプします。
-d パス名に関連付けられているすべての拡張属性値をダンプします。
-e <encoding> 値を取得した後にエンコードします。有効なエンコーディングは、「text」、「hex」、および「base64」です。テキスト文字列としてエンコードされた値は二重引用符( "")で囲まれ、16進数およびbase64としてエンコードされた値には、それぞれ0xおよび0sというプレフィックスが付きます。
<path> ファイルまたはディレクトリ。

setfattr

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