hadoopアドベントカレンダー2011 23日目 バランサーの実行ユーザ

クレジットカード現金化詐欺【業界人が教える口コミ情報】の12/23を担当するwyukawaです。

このブログを書いているのは12/25ですが歴史を改ざんしておおくりします。

Hadoopクラスタでデータの分散度合いのバランスをとるためにバランサーを実行することがあるかと思います。

ちなみに僕は勇気がないのでプロダクション環境でバランサーを実行したことありません。キリ。

以下はテスト環境で試して分かったことを書いてみたいと思います。使っているHadoopはCDHです。

rootユーザでバランサーを実行すると下記のようなエラーが出ます。実はこれでも実行できてるっぽいのですが気持ち悪いですよね。

[root@localhost ~]# /usr/lib/hadoop/bin/start-balancer.sh 
starting balancer, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-root-balancer-localhost.localdomain.out
chown: missing operand after `/usr/lib/hadoop-0.20/bin/../logs/hadoop-root-balancer-localhost.localdomain.out'
詳しくは `chown --help' を実行して下さい.

勝手に作った一般ユーザだと下記のようなパーミッションエラーになります。

[wyukawa@localhost ~]$ /usr/lib/hadoop/bin/start-balancer.sh 
starting balancer, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-wyukawa-balancer-localhost.localdomain.out
touch: cannot touch `/usr/lib/hadoop-0.20/bin/../logs/hadoop-wyukawa-balancer-localhost.localdomain.out': 許可がありません
/usr/lib/hadoop-0.20/bin/../bin/hadoop: line 452: /usr/lib/hadoop-0.20/bin/../logs/hadoop-wyukawa-balancer-localhost.localdomain.out: 許可がありません
/usr/lib/hadoop-0.20/bin/../bin/hadoop: line 456: /usr/lib/hadoop-0.20/bin/../pids/hadoop-wyukawa-balancer.pid: 許可がありません
head: `/usr/lib/hadoop-0.20/bin/../logs/hadoop-wyukawa-balancer-localhost.localdomain.out' を 読み込み用でオープンできません: そのようなファイルやディレクトリはありません

これはログとpidファイルを書き込めないからです。

書き込もうとしているディレクトリはそれぞれ/usr/lib/hadoop-0.20/logs, /usr/lib/hadoop-0.20/pidsなのですが、これはそれぞれ/var/log/hadoop-0.20/, /var/run/hadoop-0.20/へのシンボリックリンクとなっています。

この2つのディレクトリのパーミッションは下記のようになっています。hadoopグループに属するユーザじゃないと書き込めないんですね。

[wyukawa@localhost ~]$ ls -ld /var/log/hadoop-0.20/
drwxrwxr-x 2 root hadoop 4096 12月 25 22:26 /var/log/hadoop-0.20/
[wyukawa@localhost ~]$ ls -ld /var/run/hadoop-0.20/
drwxrwxr-x 2 root hadoop 4096 12月 25 22:26 /var/run/hadoop-0.20/

そんなわけでhadoopグループに属するhdfsユーザでバランサーを実行するとうまく行きます。

[root@localhost ~]# id hdfs
uid=103(hdfs) gid=104(hdfs) 所属グループ=104(hdfs),103(hadoop) context=user_u:system_r:unconfined_t
[root@localhost ~]# su hdfs /usr/lib/hadoop/bin/start-balancer.sh 
starting balancer, logging to /usr/lib/hadoop-0.20/bin/../logs/hadoop-hdfs-balancer-localhost.localdomain.out

いじょ。