kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

HDFSへのアクセスユーザ

HDFS Permissions Guide を見ると、HDFS では Linux とかで見られるようなパーミッションが設定されるようになっているらしい。

そしてスーパーユーザは NameNode の実行ユーザになるらしい。

確かに今までは HDFS に対する操作を hadoop ユーザで行ってきたのだけど、たとえば root ユーザなんかでファイルを HDFS に put しようとすると以下のように怒られる。

# ./bin/hadoop fs -put hoge.txt hoge.txt
put: org.apache.hadoop.security.AccessControlException: Permission denied:
user=root, access=WRITE, inode="user":hadoop:supergroup:rwxr-xr-x

なので、たとえば root ユーザでも書き込めるようにするにはスーパーユーザで、

$ ./bin/hadoop fs -chmod 777 /user

のように、権限を与えおく必要がある。

こうすれば、どんなユーザでもファイルを put したりできるが、put 先は /user/<ユーザ名> のディレクトリになる。一応、フルパスを指定し、アクセス権があればそこに put できるけれど、フルパスでなければホームディレクトリ(/user/<ユーザ名>)のディレクトリにファイルが作成される。

もし、Linux 上の root ユーザで、HDFS 上の hadoop ユーザとしてアクセスしたい場合は、以下のようにする必要がある。

1つめの方法は固定的にあるユーザでアクセスする方法である。この場合、core-site.xml に以下のような記述を追加すればよい。


  hadoop.job.ugi
  hadoop,supergroup

hadoop.job.ugi が HDFS にアクセスするユーザ、グループ名を決めるキーとなり、値は、最初がユーザ名で、あとはそのユーザが所属するグループ名をカンマ区切りで記述する。

2つめの方法は、プログラムでその都度アクセスするユーザを設定する方法である。この場合は、Configuration のインスタンスにユーザ、グループの情報を以下のように設定する。

Configuration conf = new Configuration();
String ugi = "hadoop,supergroup";
conf.set(UnixUserGroupInformation.UGI_PROPERTY_NAME, ugi);

Configuration インスタンスをその都度生成することで、いつでも好きなユーザで HDFS にアクセスできることになる。
しかし、このプログラムによる方法の場合、ユーザが非常にたくさんいる場合は、そのプログラムが実行される JVM のメモリの使用について注意が必要な感じがする。というのも、Configuration インスタンスから内部的に UnixUserGroupInformation インスタンスが UnixUserGroupInformation#readFromConf メソッドで生成されるのであるが、その生成されたインスタンスがユーザ名をキーとしたハッシュマップ user2UGIMap に保存されるからであり、ユーザが増えれば user2UGIMap は肥大化していく一方となる実装となっているみたいだから。