2011/01/25

Hadoopサーバーの増やし方、減らし方



すべての地雷を踏む男leonです。

Hadoopカスタマイズをネタにブログを始めさせていただきました。
前回、Hadoopセットアップ手順を紹介させていただいたので、今回からカスタマイズ話をしたいと思います。

Hadoopのincludeファイル、excludeファイルにハマった・・・。
今日はそのお話をさせていただきます。

話を始める前にincludeファイル、excludeファイルとはなんですかを説明しないとですね。
このincludeファイルとexcludeファイルはサーバーのslave接続を終了させる際に、ノードからデータを退避して脱退させる為に使用します。

includeファイルはデータノードへの接続を許可されるデータノード、JobTrackerに接続可能なTaskTrackerのホスト名を記述するファイルです。includeファイルはdfs.hostsプロパティとmapred.hostsプロパティで指定します。

excludeファイルはデータノードへの接続を許可しないデータノード、JobTrackerに接続させないTaskTrackerのホスト名を記述するファイルです。excludeファイルはdst.hosts.excludeプロパティとmapred.hosts.excludeプロパティでシステムで指定します。

includeファイルとexcludeファイルを指定した場合のノード接続のルールは以下の通りです。

includeファイルexcludeファイル扱い
含まれていない含まれていないノードへ接続不可
含まれていない含まれているノードへ接続不可
含まれている含まれていないノードへ接続可
含まれている含まれているノードは接続可で、脱退させられる

JobTracker接続へのルールは以下の通りです。

includeファイルexcludeファイル扱い
含まれていない含まれていないTrackerへ接続不可
含まれていない含まれているTrackerへ接続不可
含まれている含まれていないTrackerへ接続可
含まれている含まれているTrackerへ接続不可

Hadoopにはmastersファイル、slavesファイルという設定ファイルがあり、slavesファイルとincludeファイルには同じような内容となりますが役割が異なります。

slavesファイルは、Hadoopのデーモン起動終了といったオペレーションの制御スクリプトで参照されます。

includeファイルは、Hadoopデーモンがノード接続、Tracker接続の許可不許可を確認するために参照しています。

ここまで偉そうに説明しましたが、includeファイル、excludeファイルのことは最近まで知らずデータの退避はできないと思っていました。
というのは、Hadoopにslave接続させるサーバーを増やしていく過程ではexcludeファイルはもちろん、includeファイルも必要なかったのです。

というのも、dfs.hostsプロパティ、mapred.hostsプロパティでincludeファイルを明示的に指定していなければ、ノード、Trackerへの接続はデフォルト許可だったんです。

うぅ~ん、まぁ、いい訳ですね。

さてさて、では、includeファイル/excludeファイルを指定してslavesサーバーを正しく脱退させる手順をご紹介していくことにします。

サーバー追加手順

  1. includeファイルに追加するslaveサーバーのホスト名を追記し、Hadoopサーバー全台に設定を同期します。
    $ echo "hdslave3.domain" >> /home/hadoop/hadoop/conf/hosts.include
    $ /home/hadoop/rsync.sh
    
    ※includeファイルにはサーバーのFQDNを記述します。
    ※rsync.shは前回のHadoopセットアップ手順を参照してください。

  2. hadoopコマンドでネームノードを更新します。
    $ /home/hadoop/hadoop/bin/hadoop dfsadmin -refreshNodes
    
  3. slavesファイルに追加するslaveサーバーのホスト名を追記し、設定を同期します。
    $ echo "hdslave3" >> /home/hadoop/hadoop/conf/slaves
    $ /home/hadoop/rsync.sh
    
  4. Hadoopシステムを再起動します。
    $ /home/hadoop/hadoop/bin/stop-all.sh
    $ /home/hadoop/hadoop/bin/start-all.sh
    

サーバー脱退手順

  1. excludeファイルにslave接続から脱退させるサーバーのホスト名を追記し、設定を同期します。
    $ echo "hdslave3.domain" >> /home/hadoop/hadoop/conf/hosts.exclude
    $ /home/hadoop/rsync.sh
    
  2. HadoopシステムのMapReduceクラスタを再起動します。
    $ /home/hadoop/hadoop/bin/stop-mapred.sh
    $ /home/hadoop/hadoop/bin/start-mapred.sh
    
  3. hadoopコマンドでネームノードを更新します。
    $ /home/hadoop/hadoop/bin/hadoop dfsadmin -refreshNodes
    
  4. 脱退中のデータノードからデータが退避されるのをひたすら(弊社の規模では1?2日)待ちます。
    データが退避できたかどうかは、以下のコマンドで確認します。
    $ hadoop/home/hadoop/bin/hadoop dfsadmin -refreshNodes
    
    StateがDecommission in progress から Decommissionedへ変更したらデータ退避完了です。

  5. includeファイル、excludeファイル、slavesファイルから脱退させるサーバーのホスト名を削除し、設定を同期します。
    $ grep -v "hdslave3" /home/hadoop/hadoop/conf/hosts.include >> /home/hadoop/hadoop/conf/hosts.include
    $ grep -v "hdslave3" /home/hadoop/hadoop/conf/hosts.exclude >> /home/hadoop/hadoop/conf/hosts.exclude
    $ grep -v "hdslave3" /home/hadoop/hadoop/conf/slaves >> /home/hadoop/hadoop/conf/slaves
    $ /home/hadoop/rsync.sh
    
  6. Hadoopシステムを再起動します。
    $ /home/hadoop/hadoop/bin/stop-all.sh
    $ /home/hadoop/hadoop/bin/start-all.sh
    
  7. hadoopコマンドでネームノードを更新します。
    $ /home/hadoop/hadoop/bin/hadoop dfsadmin -refreshNodes
    

なんと、手順説明までで時間切れになってしまいました。
ハマったお話は次回とさせていただきます。
ではでは