hadoop環境の構築 事前準備
前回ご紹介したhadoopですが、今回は実際にhadoopが動作する環境を構築したいと思います。インストールする環境は、以前TokyoTyrantを導入した仮想マシンをそのまま流用したいと思います。
環境 |
OS : CentOS 5.4(32bit) |
構成 |
hadoop1:masterサーバ…NameNode/JobTracker(NFSサーバ)
hadoop2, hadoop3:slaveサーバ…DataNode/TaskTracker(NFSクライアント) |
- NameNode, DataNodeはHDFSのための機能→masterサーバ
- JobTracker, TaskTrackerはMapReduceのための機能→slaveサーバ
NFSはhadoopの設定やプログラムを共通で使用するために導入します(導入の手間を軽減するため)。
それでは構築作業を進めていきます。
NFSディレクトリの作成
hadoop1に/usr/local/apach_projディレクトリを作成します。このディレクトリにはhadoopnのバイナリや設定ファイルが置かれ、hadoop2, hadoop3から共通に使用されることになります。NFSの設定については後で記述します。
hadoop1でディレクトリを作成します。
Javaのインストール
hadoopはJavaプラットフォームで動作しますので、事前にJavaをインストールしておく必要があります。
とし、Javaをインストールします。
java-1.4.2-gcj-compatが元々入っている可能性がありますが、こちらのJavaではうまく動作しないようです。openjdkを入れることでalternativesによりopenjdkが最優先になります。ならない場合はgcj-compatを削除してください。
host名の設定
hadoop1, hadoop2, hadoop3がお互いがホスト名で通信できるように設定します。ここではそれぞれのサーバの/etc/hostsを使用し、ホスト名とIPアドレスの組み合わせを記述します。
私の環境では以下の情報をそれぞれのサーバの/etc/hostsに記述しています。
接続確認は、ping hadoop2などとして確認しましょう。
今回の構成ではLANの中にある安全な環境という前提で、ファイアウォールは全て解除しています。
で停止させておきましょう。また、SELINUXもdisabledとしています。
hadoopのダウンロード
hadoopのパッケージはHadoop Distributed File System Releasesのページからからダウンロードが可能です。
hadoop1でダウンロードします。
このパッケージにはhadoopのHDFS、MapReduceの2つのパッケージが入っています。
ダウンロードしたファイルをapache_projに移動し、展開します。
hadoop-0.21.0というディレクトリが作成されたと思います。バージョン番号が入っていては環境変数の設定などが煩雑になりますので、リンクを作成します。
これで、/usr/local/apache_proj/hadoopでダウンロードしてきたファイル群にアクセスが可能となります。
今後、このディレクトリは$HADOOP_HOMEとして記述します。基本的にはこれでhadoopの導入は終わりで、後は設定作業となります。
hadoop起動ユーザの追加
hadoopのプロセス起動用にユーザを追加します。このユーザがhadoopのプロセスを立ち上げることになります。私の環境では、hというユーザを作成しました。
hadoop1, hadoop2, hadoop3で以下のコマンドを実行します。
パスなしでのsshができるよう設定する
hadoop起動ユーザはパスワードなしでのsshログインが必要となります。hユーザをパスなしでsshさせるために、パスフレーズなしの鍵を生成します。
hadoop1で下記を実行します。
ここで作成したauthorized_keysをhadoop2, hadoop3にコピーします。
コピー後、hadoop1 → hadoop2, hadoop1 → hadoop3へのsshを行い、パスワードなしでログインできることを確認します。
環境変数の設定
hユーザの.bashrcを編集し、hadoopに関する環境変数を定義します。hadoop1の.bashrcに以下を追記します。
追記後、scpを用いてhadoop2, hadoop3にコピーします。
これでhadoopコマンドへのpathが通り、'hadoop'だけでコマンドが実行できるようになります。
パーミッションの設定
/usr/local/apache_projディレクトリに対し、hユーザのパーミッションを設定します。
ディレクトリの設定
hadoopで必要なデータ保存ディレクトリやpidファイルの場所の設定をします。全てのサーバで以下のコマンドを実行します。
hadoopの設定
さてここからがhadoopの設定になります。
以下の作業はh@hadoop1で行います。基本的に設定ファイルは$HADOOP_HOME/confに集約されています。
Javaへのパスの設定
$HADOOOP_HOME/conf/hadoop-env.shがありますので、エディタで開き、export JAVA_HOME=/xx の行をコメントを外し、Javaディレクトリへのパスを設定します。私の環境では、/usr/lib/jvm/jreとなりました。
master, slaveの設定
master(HDFSでのNameNode、MapReduceでのJobTracker)が誰かを設定します。$HADOOP_HOME/conf/masterを編集し、以下を記述します。
slave(HDFSでのDataNode、MapReduceでのTaskTracker)が誰かを設定します。$HADOOP_HOME/conf/slavesを編集し、以下を記述します。
データディレクトリ、PIDファイルの設定
HDFSでのデータ保存用ディレクトリを設定します。デフォルトでは/tmpになっているため、しばらく動作させているとデータが欠落していく可能性があります(linuxでは定期的に/tmp, /var/tmpをきれいにしてくれる(tmpwatch))。
事前作業で作成したディレクトリを設定します。$HADOOP_HOME/conf/core-site.xmlを以下のように編集します。
また、$HADOOP_HOME/conf/hadoop-env.shに以下を追記します。
レプリケーションの設定
HDFSで管理されるデータのレプリケーション数を定義します。設定ファイルは$HADOOP_HOME/conf/hdfs-site.xmlになります。以下のように編集します。
JobTrackerの設定
MapReduceでのタスク管理サーバの情報を記述します。設定ファイルは$HADOOP_HOME/conf/mapred-site.xmlです。以下のように編集します。
以上で、hadoopの基本的な設定は完了です。
次に、これらの設定ファイルを共有するために、NFSの設定を行います。
NFSの設定
ここでは各種設定ファイルの内容を記述しておきます。
hadoop2, 3で以下のディレクトリを作成します。
hadoop1の/etc/exportファイルに下記を追加。
hadoop2, hadoop3の/etc/fstabに下記を追加。
hadoop1を起動後、hadoop2,3を起動するようにしてください。
hadoopの起動
それではいよいよhadoopの起動ですが、まずはHDFSの初期化を行います。
画面上にメッセージが流れますが、以下のメッセージが最後に確認できれば問題ないでしょう。
次にhadoopの起動です。hadoop1でhユーザになって以下のコマンドを実行します。
こちらも画面上にメッセージが流れますが、途中で以下のようなメッセージが出て止まる可能性があります。これはsshで最初に接続した際に表示されるダイアログです。yesと答えましょう。
起動の確認
hadoopには管理用のWebページが用意されており、サーバのステータスやログを確認することができます。
画面上ではわかりにくいかもしれませんが、Live Nodes: 2となっており、hadoop2, hadoop3が正常に起動していることがわかります。
こちらもNodesが2となっており、正常に動作していると思われます。
次回はMapReduceを実際に動作させてみましょう。