R&Dトレンドレポート

第8回Hadoopの環境を作ってみよう!

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の設定やプログラムを共通で使用するために導入します(導入の手間を軽減するため⁠⁠。

図1 システム構成図
図1 システム構成図

それでは構築作業を進めていきます。

NFSディレクトリの作成

hadoop1に/usr/local/apach_projディレクトリを作成します。このディレクトリにはhadoopnのバイナリや設定ファイルが置かれ、hadoop2, hadoop3から共通に使用されることになります。NFSの設定については後で記述します。

hadoop1でディレクトリを作成します。

# mkdir /usr/local/apache_proj

Javaのインストール

hadoopはJavaプラットフォームで動作しますので、事前にJavaをインストールしておく必要があります。

# yum install java-1.6.0-openjdk-devel

とし、Javaをインストールします。

java-1.4.2-gcj-compatが元々入っている可能性がありますが、こちらのJavaではうまく動作しないようです。openjdkを入れることでalternativesによりopenjdkが最優先になります。ならない場合はgcj-compatを削除してください。

host名の設定

hadoop1, hadoop2, hadoop3がお互いがホスト名で通信できるように設定します。ここではそれぞれのサーバの/etc/hostsを使用し、ホスト名とIPアドレスの組み合わせを記述します。

私の環境では以下の情報をそれぞれのサーバの/etc/hostsに記述しています。

192.168.47.101	hadoop1
192.168.47.102	hadoop2
192.168.47.103	hadoop3
192.168.47.103	hadoop3

接続確認は、ping hadoop2などとして確認しましょう。

今回の構成ではLANの中にある安全な環境という前提で、ファイアウォールは全て解除しています。

# /etc/init.d/iptables stop

で停止させておきましょう。また、SELINUXもdisabledとしています。

hadoopのダウンロード

hadoopのパッケージはHadoop Distributed File System Releasesのページからからダウンロードが可能です。

hadoop1でダウンロードします。

# wget http://www.meisei-u.ac.jp/mirror/apache/dist//hadoop/core/hadoop-0.21.0/hadoop-0.21.0.tar.gz

このパッケージにはhadoopのHDFS、MapReduceの2つのパッケージが入っています。

ダウンロードしたファイルをapache_projに移動し、展開します。

# mv hadoop-0.21.0.tar.gz /usr/local/apache_proj
# cd /usr/local/apache_proj
# tar zxvf hadoop-0.21.0.tar.gz

hadoop-0.21.0というディレクトリが作成されたと思います。バージョン番号が入っていては環境変数の設定などが煩雑になりますので、リンクを作成します。

# ln -s hadoop-0.21.0 hadoop

これで、/usr/local/apache_proj/hadoopでダウンロードしてきたファイル群にアクセスが可能となります。

今後、このディレクトリは$HADOOP_HOMEとして記述します。基本的にはこれでhadoopの導入は終わりで、後は設定作業となります。

hadoop起動ユーザの追加

hadoopのプロセス起動用にユーザを追加します。このユーザがhadoopのプロセスを立ち上げることになります。私の環境では、hというユーザを作成しました。

hadoop1, hadoop2, hadoop3で以下のコマンドを実行します。

# useradd h

パスなしでのsshができるよう設定する

hadoop起動ユーザはパスワードなしでのsshログインが必要となります。hユーザをパスなしでsshさせるために、パスフレーズなしの鍵を生成します。

hadoop1で下記を実行します。

$ ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys

ここで作成したauthorized_keysをhadoop2, hadoop3にコピーします。

コピー後、hadoop1 → hadoop2, hadoop1 → hadoop3へのsshを行い、パスワードなしでログインできることを確認します。

環境変数の設定

hユーザの.bashrcを編集し、hadoopに関する環境変数を定義します。hadoop1の.bashrcに以下を追記します。

export HADOOP_HOME=/usr/local/apache_proj/hadoop
export PATH="$PATH:$HADOOP_HOME/bin"

追記後、scpを用いてhadoop2, hadoop3にコピーします。

$ scp .bashrc h@hadoop2:~
$ scp .bashrc h@hadoop3:~

これでhadoopコマンドへのpathが通り、'hadoop'だけでコマンドが実行できるようになります。

パーミッションの設定

/usr/local/apache_projディレクトリに対し、hユーザのパーミッションを設定します。

# chown -R h:h /usr/local/apache_proj

ディレクトリの設定

hadoopで必要なデータ保存ディレクトリやpidファイルの場所の設定をします。全てのサーバで以下のコマンドを実行します。

# mkdir /usr/loal/hdfs
# chwon -R h:h /usr/local/hdfs

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を編集し、以下を記述します。

hadoop1

slave(HDFSでのDataNode、MapReduceでのTaskTracker)が誰かを設定します。$HADOOP_HOME/conf/slavesを編集し、以下を記述します。

hadoop2
hadoop3

データディレクトリ、PIDファイルの設定

HDFSでのデータ保存用ディレクトリを設定します。デフォルトでは/tmpになっているため、しばらく動作させているとデータが欠落していく可能性があります(linuxでは定期的に/tmp, /var/tmpをきれいにしてくれる(tmpwatch)⁠⁠。

事前作業で作成したディレクトリを設定します。$HADOOP_HOME/conf/core-site.xmlを以下のように編集します。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
        <property>
                <name>hadoop.tmp.dir</name>
                <value>/usr/local/hdfs/${user.name}</value>
        </property>
        <property>
                <name>fs.default.name</name>
                <value>hdfs://hadoop1:9000</value>
        </property>
</configuration>

また、$HADOOP_HOME/conf/hadoop-env.shに以下を追記します。

export HADOOP_PID_DIR=/usr/local/hdfs/pids

レプリケーションの設定

HDFSで管理されるデータのレプリケーション数を定義します。設定ファイルは$HADOOP_HOME/conf/hdfs-site.xmlになります。以下のように編集します。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
    <name>dfs.replication</name>
    <value>2</value>
  </property>
</configuration>

JobTrackerの設定

MapReduceでのタスク管理サーバの情報を記述します。設定ファイルは$HADOOP_HOME/conf/mapred-site.xmlです。以下のように編集します。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <property>
    <name>mapred.job.tracker</name>
    <value>hadoop1:9001</value>
  </property>
</configuration>

以上で、hadoopの基本的な設定は完了です。

次に、これらの設定ファイルを共有するために、NFSの設定を行います。

NFSの設定

ここでは各種設定ファイルの内容を記述しておきます。

hadoop2, 3で以下のディレクトリを作成します。

# mkdir /usr/local/apache_proj

hadoop1の/etc/exportファイルに下記を追加。

/usr/local/apache_proj  192.168.0.0/255.255.0.0(rw,no_root_squash)

hadoop2, hadoop3の/etc/fstabに下記を追加。

hadoop1:/usr/local/apache_proj	/usr/local/apache_proj		nfs	defaults 	0 0

hadoop1を起動後、hadoop2,3を起動するようにしてください。

hadoopの起動

それではいよいよhadoopの起動ですが、まずはHDFSの初期化を行います。

$ hadoop namenode -format

画面上にメッセージが流れますが、以下のメッセージが最後に確認できれば問題ないでしょう。

10/10/04 08:49:51 INFO namenode.NameNode: SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down NameNode at hadoop1/192.168.47.101
************************************************************/

次にhadoopの起動です。hadoop1でhユーザになって以下のコマンドを実行します。

$ start-all.sh

こちらも画面上にメッセージが流れますが、途中で以下のようなメッセージが出て止まる可能性があります。これはsshで最初に接続した際に表示されるダイアログです。yesと答えましょう。

RSA key fingerprint is 30:85:64:a1:37:d6:43:25:4c:2e:b4:82:cb:f7:04:76.
Are you sure you want to continue connecting (yes/no)?

《中略》

hadoop2: starting tasktracker, logging to /usr/local/apache_proj/hadoop/bin/../logs/hadoop-h-tasktracker-hadoop2.out
hadoop3: starting tasktracker, logging to /usr/local/apache_proj/hadoop/bin/../logs/hadoop-h-tasktracker-hadoop3.out

起動の確認

hadoopには管理用のWebページが用意されており、サーバのステータスやログを確認することができます。

図2 HDFSの管理ページ(http://hadoop1:50070/)
図2 HDFSの管理ページ(http://hadoop1:50070/)

画面上ではわかりにくいかもしれませんが、Live Nodes: 2となっており、hadoop2, hadoop3が正常に起動していることがわかります。

図3 MapReduceの管理ページ(http://hadoop1:50030/)
図3 MapReduceの管理ページ(http://hadoop1:50030/)

こちらもNodesが2となっており、正常に動作していると思われます。

次回はMapReduceを実際に動作させてみましょう。

おすすめ記事

記事・ニュース一覧