生物物理計算化学者の雛

主に科学に関する諸々を書き留めています。

長期間起動していたHadoopデーモン終了時に「no tasktracker to stop」と失敗する現象への対処

(Hadoop 0.21.0環境)
多数ノードで一斉に tasktracker や datanode を起動する際には

$HADOOP_HOME/bin/start-mapred.sh
$HADOOP_HOME/bin/start-dfs.sh

を、また各ノードで起動する際には

$HADOOP_HOME/bin/hadoop-daemon.sh start tasktracker
$HADOOP_HOME/bin/hadoop-daemon.sh start datanode

といった具合に実行します。

そしてHadoopデーモンを終了する際は

$HADOOP_HOME/bin/stop-mapred.sh
$HADOOP_HOME/bin/stop-dfs.sh

各ノードでは

$HADOOP_HOME/bin/hadoop-daemon.sh stop tasktracker
$HADOOP_HOME/bin/hadoop-daemon.sh stop datanode

といった具合に実行します。

最近になって、起動直後のデーモンを終了させる場合は問題なく終了されるものの、1か月以上の長期間起動しっぱなしだったデーモンを終了させる場合は終了コマンドを実行しても「no tasktracker to stop」「no datanode to stop」と表示され、デーモンは終了されないことに気付きました。
この場合は jps によって java 実行中のコマンドを表示させ、kill コマンドによって手動で終了させる必要があります。

デーモン情報が保存されるデフォルトの/tmpディレクトリ内のファイルは定期的に削除される

この原因は、Hadoop デーモン起動時にデーモンのプロセスIDが /tmp ディレクトリ内に hadoop-hadoop-datanode.pid のような名前のファイルに保存され、デーモン終了プログラムはこのファイルを終了時に参照して kill すべきプロセスIDを取得しているためだとわかりました。

/tmp ディレクトリはこのサイト(http://pentan.info/server/linux/tmp_del.html)にあるように一時ファイルを保存する場所であり、定期的に(/etc/cron.daily/tmpwatch を参照)アクセスされないファイルが削除されてしまうため、プロセスIDを保存したファイルが削除されてしまっていたのです。

これを避けるには、 /etc/cron.daily/tmpwatch を書き換えて /tmp ディレクトリの中身を自動的に削除しないようにしてしまうか、あるいはプロセスIDを保存する場所を変更します
プロセスID保存場所変更は $HADOOP_HOME/conf/hadoop-env.sh 内に

export HADOOP_PID_DIR=/var/hadoop/pids

のように記述することで可能です。