Hadoopクラスタ構築 AccessControlException: Permission denied

Hadoopクラスタ構築でつまったこととして

1. hadoop.tmp.dirの権限がおかしいといわれたケース
2. MapReduceジョブ実行時にAccessControlException: Permission deniedエラーのケース

の2件についてのメモ

!



1. hadoop.tmp.dirの権限がおかしいといわれたケース

$ hadoop jar hadoop-examples.jar pi 4 100
Error creating temp dir in hadoop.tmp.dir /hadoop due to 許可がありません
対処法

hadoop.tmp.dirの権限を修正します

chmod 777 /hadoop

!



2. MapReduceジョブ実行時にAccessControlException: Permission deniedエラーのケース

$ hadoop job hadoop-examples.jar pi 4 100

...
2013-05-15 15:43:01,160 ERROR org.apache.hadoop.security.UserGroupInformation: 
PriviledgedActionException as:hadoop (auth:SIMPLE) cause:org.apache.hadoop.security.
AccessControlException: Permission denied: user=hadoop, access=EXECUTE, inode=
"/hadoop/mapred":mapred:supergroup:drwx------  

2013-05-15 15:43:01,160 INFO org.apache.hadoop.ipc.Server: IPC Server handler 0 on 54310, 
call setPermission(/hadoop/mapred/staging/hadoop/.staging/job_201305151532_0003, rwx------) 
from 192.168.1.80:60777: error: org.apache.hadoop.security.AccessControlException: 
Permission denied: user=hadoop, access=EXECUTE, inode="/hadoop/mapred":mapred:supergroup:
drwx------org.apache.hadoop.security.AccessControlException: Permission denied: user=hadoop, 
access=EXECUTE, inode="/hadoop/mapred":mapred:supergroup:drwx-----
...

HDFSではLINUXライクなパーミッション機能*1を実装しており、AccessControlException: Permission deniedというのはそのまま、HDFS上のファイルアクセス時にパーミッションを満たしてない場合のエラーメッセージです。
hadoopユーザが"/hadoop/mapred"にアクセスしようとしておこられています。

ここで、ジョブ投入時のHadoopの動作について簡単に説明すると、

1. クライアントがJobtrackerにジョブを投げる
2. 新しジョブIDが発行される
3. ジョブの引数(入出力ファイルパスなど)のチェック
4. 十分な複製数で実行ファイルをHDFS上に格納する
5. JobtrackerのsubmitJob()を呼び出し、ジョブの実行準備が整ったことを知らせる

となります。

今回のエラーというのは、先のジョブ投入時の流れでいう4番目の”HDFS上に実行ファイルを作成する際のエラー”ということになります。
ジョブファイルを格納するHDFS上のパスは、"mapred-site.xml"で設定できます。以下はデフォルト設定。

<property>
    <name>mapred.system.dir</name>          
    <value>${hadoop.tmp.dir}/mapred/system</value>
</property>  


実際、ジョブが正しく受理された場合、以下のようにHDFS上にファイルが作成されます。


ジョブ投入前

# hadoop dfs -lsr /hadoop/mapred/staging/
drwx------   - mapred supergroup          0 2013-05-15 15:54 /hadoop/mapred/staging/mapred
drwx------   - mapred supergroup          0 2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

ジョブ受理後

# hadoop dfs -lsr /hadoop/mapred/staging/
drwx------   - mapred supergroup          0  2013-05-15 15:54 /hadoop/mapred/staging/mapred
drwx------   - mapred supergroup          0  2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging
drwx------   - mapred supergroup          0  2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging/job_201305151554_0003
-rw-r--r--  10 mapred supergroup     142821  2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging/job_201305151554_0003/job.jar
-rw-r--r--  10 mapred supergroup        487  2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging/job_201305151554_0003/job.split
-rw-r--r--   3 mapred supergroup        349  2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging/job_201305151554_0003/job.splitmetainfo
-rw-r--r--   3 mapred supergroup      34920  2013-05-15 19:05 /hadoop/mapred/staging/mapred/.staging/job_201305151554_0003/job.xml

!




これについていくつかの対処法があります。




!




対処法

!

1. mapred.system.dirの権限を修正。777なり所有者かえるなり
2. ユーザごとに作業フォルダを作成する
3. HDFSパーミッションの確認をオフにする

例) mapred-site.xml

<property>
    <name>mapred.system.dir</name>          
    <value>${hadoop.tmp.dir}/mapred/system</value>
</property>  

というデフォルト設定の場合

${hadoop.tmp.dir}を/hadoopとすると

方法1
hadoop fs -chmod 777 /hadoop/mapred/system

もしくは、mapredユーザでしか操作しないのならば、

hadoop fs -chown mapred:hadoop /hadoop/mapred/system

とすることもできる。

方法2
<property>
    <name>mapred.system.dir</name>          
    <value>${hadoop.tmp.dir}/${user.name}</value>
</property>  

となります。自環境ではこの方法2をとりました。
これ自体、セキュリティのための機能ではないので。複数ユーザで運用した時の事故等を防ぐためのものなのでディレクトリを分ければいいかと

方法3
<property>
    <name>dfs.permissions</name>
    <value>false</false>
</property>

いっそパーミッションの機能をきる。
HDFSパーミッションの機能は、セキュリティを目的としたものではなく、ユーザやプログラムのミス・バグを予防するためのものなので。*2

*1:POSIXのものとよく似たパーミッション。読み込み(r),書き込み(w),実行(x)のパーミッションがある。r,wについてはPOSIXと同意だが、実行パーミション(x)だけは意味が異なる。HDFS上のファイルは実行することができないので、ここでのxとはディレクトリについて、その子にアクセスできることを意味する。

*2:ユーザ識別子は平文で送られる。クライアント側で新しくユーザを作れば誰にでもなれる。セキュリティを確保したい場合は、Kerberosを利用する。

© karahiyo