5日目です
最近(と言っても少し前ですが)、HDFSにもLinuxでおなじみの拡張属性(xattr)が追加されました。今回はこの機能がどういうものかを見てみましょう。
HDFSの権限
HDFSにはパーミッション(権限)の設定ができます。権限の設定により、誤ってファイルの削除を回避したり、権限のないユーザーがファイルを読めないようにするなどができます。(が、権限を指定しても悪意のあるユーザーのファイル操作からの保護はできないので、強固なセキュリティのためにはKerberos認証などと組み合わせる必要があります)。
また、HDFSに追加されたアクセス制御リスト(ACL)により、より柔軟な設定を行うことができます。
HDFSで権限や所有者を変更するには、 hdfs dfs コマンド(またはhadoop fsコマンド)から、chmod / chown / chgrp などのサブコマンドを使用します。いくつかの変更を行ってみました(一部のコマンドの出力が右側に隠れています)
※権限を有効にするにはdfs.permissions をtrueに設定します。
[shell]
#ディレクトリを確認
$ hdfs dfs -ls testdir
Found 1 items
-rw-r–r– 1 cloudera cloudera 66 2014-12-05 07:06 testdir/test.txt
#パーミッションを777に変更
$ hdfs dfs -chmod 777 testdir/test.txt
$ hdfs dfs -ls testdir
Found 1 items
-rwxrwxrwx 1 cloudera cloudera 66 2014-12-05 07:06 testdir/test.txt
#所有者を変更しようとするが、スーパーユーザーではないので失敗
$ hdfs dfs -chown hue testdir/test.txt
chown: changing ownership of ‘testdir/test.txt’: Non-super user cannot change owner
#hdfsユーザーで実行し、成功
$ sudo -u hdfs hdfs dfs -chown hue /user/cloudera/testdir/test.txt
#変更されたことを確認
$ hdfs dfs -ls testdir
Found 1 items
-rwxrwxrwx 1 hue cloudera 66 2014-12-05 07:06 testdir/test.txt
[/shell]
HDFSの拡張属性
さて、今回サポートされた拡張属性 (eXtended-attr: xattr) とはどういうものでしょうか。拡張属性はWikipediaにも記載されていますが、ファイルやディレクトリに拡張属性を割り当てることができる機能です。従来のファイルシステムが提供する権限(パーミッション)とは異なります。ファイルシステムが関与しないメタ情報を付与できるというものです。
hdfs dfs -setfattrと-getfattr
HDFSの拡張属性はHadoop公式ページにドキュメントがあります。Extended Attributes in HDFS
上記ページからコマンドの使い方のみ抜粋して意訳してみました。(間違いがあるかもしれないので、コマンドを使用する際は公式ドキュメントをご覧下さい)
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 | 拡張属性の名前 |
-v value | 拡張属性の値。値には3つの異なるエンコーディングメソッドがある。値がダブルクォートで囲まれていれば、クォートの中の文字列が値になる。0xまたは0Xが先頭に付与されていれば16進数として扱う。引数の先頭に0sまたは0Sが付与されていればbase64エンコーディングとして扱う |
-x name | 拡張属性を取り除く |
<path> | ファイルまたはディレクトリ |
拡張属性を使用する
実際に拡張属性を使ってみます。ドキュメントによると、HDFSで指定できるのは以下の5つのネームスペースです。
- user 一般的にクライアントアプリによって使用されるネームスペース
- trusted HDFSのスーパーユーザーのみが利用可能なネームスペース
- system HDFS内部で使用するために予約
- security 同上
- raw 同上
(詳細はドキュメントを参照)
コマンド実行結果
[shell]
#ディレクトリ作成
$ hdfs dfs -mkdir /test
#ディレクトリに拡張属性をセット
$ hdfs dfs -setfattr -n user.a1 -v 123456 /test
#拡張属性を表示
$ hdfs dfs -getfattr -n user.a1 /test
# file: /test
user.a1="123456"
[/shell]
まずはうまく設定できているようです。
コメント