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 は肥大化していく一方となる実装となっているみたいだから。