hadoop.tmp.dir を tmp 配下に置いてはいけない!?:distributed cacheの問題

oozie の Hive アクションや sqoop アクションで、HQLファイルやsqoop スクリプトファイルが確かに指定したパスに存在するのに FileNotFound になる現象が急に起き始めて、悩まされていた。しかも、何度もやってると、どうもうまく行く時とエラーになるときがあるようだ・・・
推測だが、どうも distributed cache の問題のようだ。

oozieは、HQLファイルやsqoop スクリプトを distributed cache に入れて、1taskのmapで処理を実行されている。
ログを見ると、ファイルがdistcache に登録されているのに、実際にはファイルが配られていないように見える。
さらにログを眺めたりサーバ上のデータをlsしたりしつつ、Hadoop のソースをチラ見した上で、以下の仮説が思い浮かんだ。

どうやら、distcache は毎回ジョブ起動時にHDFSからデータを配っているのではなく、Tasktrackerがキャッシュを持っているようだ。
そして、そのキャッシュは hadoop.tmp.dir 配下のパスに格納されていると思われる。
CDH3u0の初期設定では、hadoop.tmp.dir が /tmp 配下になっているのだが、キャッシュファイルが古くなり、tmpwatchに消されたものの、Tasktrackerがそれに気づかなかったのではないか?

hadoop.tmp.dir の場所を変更し、クラスタを再起動後、試しに oozie の workflow を再度流してみると、順調に動いているようだ。これでしばらく様子を見てみよう。
なお、hadoop.tmp.dir はフルアクセスでなければならないので注意。
http://metasearch.sourceforge.jp/wiki/index.php?Hadoop%A5%BB%A5%C3%A5%C8%A5%A2%A5%C3%A5%D7#y1b3a4e5

・上記仮説を思いつくきっかけとなったログ
問題のタスクを実行したTaskTrackerのログ(hadoop-hadoop-tasktracker-[hostname].log)

2012-01-17 08:46:50,482 INFO org.apache.hadoop.filecache.TrackerDistributedCacheManager: Using existing cache of /user/oozie/target-analysis/lib/sqoop_connection.txt#sqoop_connection.txt->/tmp/hadoop-mapred/mapred/local/taskTracker/distcache/5836994635340200164_-814146225_2129161632/next-dev01/user/oozie/target-analysis/lib/sqoop_connection.txt