(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
のように記述することで可能です。