lxcficon.jpg Hadoop サーバー 

元のページに戻る

Hadoop サーバー

HadoopのサーバーをLXCFのコンテナ上に構築します。
1台のサーバーでは結局ほとんどスケールアウトしないのですが、構築方法の習得用や本番システムではできないデバッグ用に使うことができます。 また、ここで構築したシステムの設定ファイルに追加で登録するだけで、DataNode用に外部のサーバーをいくらでも追加することも可能です。 増設したHadoopシステムは実用的なシステムとして実運用に使えます。

1. 今回構築するサーバの構成

CPU : Core i7 4 core 8 thread 
Memory : 4GB 
OS: Fedore 20 
Hadoop version : 2.2.0 (Fedora 20 のパッケージに入っているもの)

2. Hadoopの構成

LXCF-Hadoop.jpg

- HOST、Second NameNodeおよびDataNode x8台で構成する。
- Second NameNodeとDataNodeは、LXCFのコンテナで生成する。
- HOST上では、Hadoopのコンポーネントのうち、次のものを動作させる。 
  NameNode, ResourceNode, NodeManager, JobHistoryServer
- Second NameNodeは、NameNodeのバックアップとする。
- DataNodeの8台は、それぞれに1つのCPU(thread)を割り当てる。

以前にHadoop1.xを使ったことがあったのですが、Hadoop2.xはその時と比べて設定や使い方が大きく変わっていて驚きました。 また、Hadoop2.x以降の設定は、Web上で検索してもなかなか出てこなかったりします。
ここで説明する方法はそのような状態の中で試行錯誤を繰り返しながら見つけた方法です。 LXCFでなくても、Fedora 20上で、複数サーバ構成のHadoopシステムを構築するための参考になれば幸いです。

3. インストールと構築

LXCFについては事前にパッケージをインストールしてあるものとします。

1) javaのインストール

OracleのJavaでなくても良いです。インストールされていなければFedoraのJDKのパッケージをインストールしておきます。

$ su -
# yum install jdejava-1.7.0-openjdk java-1.7.0-openjdk-devel java-1.7.0-openjdk-headless

2) Hadoopパッケージのインストール

とりあえずめぼしいものはすべてインストールします。

# yum install 'hadoop*'

3) sshでのパスワード設定

HOSTからHOSTへのパスワードなしでssh ログインできるようにします。 これはHadoopを起動すると、HOSTやクラスタを構成するサーバにHadoopのコンポーネントがsshログインしてプログラムを実行していくためです。 LXCFでなければ、HOSTの公開キーをクラスタを構成するサーバにも配布しておかなければなりません。 しかし、LXCFではコンテナを生成したときに自動的にその作業を行うため、HOSTだけ設定しておけばOKです。

# cd ~/.ssh
# cat lxcf_rsa.pub >> autohrized_keys
# chmod 400 authorized_keys

4) /etc/hostsにHOSTのIPアドレスを登録

/etc/hostsにHOSTのIPアドレスを登録しておきます。

# vi /etc/hosts

/etc/hostsファイルの一番最後の行に「IPアドレス HOST名」を追加して登録してください。 HOST名は、hostnameコマンドで表示される名前を登録してください。

5) Hadoopの設定ファイルの書き換え

/etc/hadoopの下にある設定ファイルをいくつか書き換えます。

core-site.xmlの書き換え

fs.default.nameがlocalhostとなっているところを、HOST名に書き換えてください。port番号はそのままで良いです。

 略...
  <property>
    <name>fs.default.name</name>
    <value>hdfs://HOST名:8020</value>
  </property>
 略...

mapred-site.xmlの書き換え

mapred.job.trackerがlocalhostとなっているところを、HOST名に書き換えてください。

 略...
  <property>
    <name>mapred.job.tracker</name>
    <value>HOST名:8021</value>
  </property>
 略...

hdfs-site.xmlにsecond namenode定義を追加

dfs.secondary.http.addressのnamenode2ndの定義を追加してください。この定義は元来はありません。前からある<property>の定義と並列の場所に追加します。
namenode2ndというのは今はまだ存在しないコンテナの名前です。「2. Hadoopの構成」を参照してください。 LXCFではなく、外部のサーバを使用する場合には/etc/hostsに登録しておいてください。 今回は、LXCFでnamenode2ndを生成すると、自動的に/etc/hostsに登録されます。

 略...
  <property>
      <name>dfs.secondary.http.address</name>
      <value>namenode2nd:50490</value>
  </property> 
 略...

slavesファイルにdatanodeを登録

すでにlocalhostが登録されていますがそれは消してください。 そして、datanodeにするanalysis0001からanalysis0008を1行ずつ追加してください。

analysis0001
analysis0002
analysis0003
analysis0004
analysis0005
analysis0006
analysis0007
analysis0008

datanodeの構成については、「2. Hadoopの構成」を参照してください。

また、このファイルに外部サーバを登録すれば、datanodeをどんどん増やしてスケールアウトさせることが可能です。

6) LXCFのコンテナ生成

それでは、設定ファイルに登録した、namenode2nd, analysis0001 から analysis0008までを生成します。
まず、namenode2ndの生成。

# lxcf sysgen namenode2nd


次にanalysis0001 から analysis0008までをまとめて生成。
# lxcf sysgen-n analysis 8


HOSTをリブートしても、コンテナ群が自動的に再起動するようにLXCFのautostartを設定しておきます。
# lxcf autostart namenode2nd analysis0001 analysis0002 analysis0003 analysis0004 analysis0005 analysis0006 analysis0007 analysis0008

LXCFのコンテナはHOSTにインストールされたJavaやHadoopのソフトをすべて引き継いでいます。
外部のサーバーを使う場合には、それぞれのサーバーにJavaやHadoopのインストールが必要になります。

7) namenodeのフォーマット

namenodeをフォーマットしておきます。

# hdfs namenode --format

ここまでの作業は最初に一回だけ実施しておけばよいです。

8) Hadoopのコンポーネントの起動

ここまで、問題なくできたでしょうか。次はHadoopのコンポーネントの起動を行います。
最初なので、一つずつ順に行います。コマンド数が多いので、後でshスクリプトでまとめると便利です。

# start-dfs.sh
# start-yarn.sh
# hadoop-daemon.sh start datanode
# yarn-daemon.sh start nodemanager
# mr-jobhistory-daemon.sh start historyserver

うまくいっていれば、jpsコマンドで起動したコンポーネント名が表示されます。

# jps
20349 ResourceManager
577 JobHistoryServer
55326 DataNode
56405 NodeManager
1207 Jps
19735 NameNode

おめでとう!
ここまでうまくできていれば、Hadoopが無事起動しました。
つぎは、実際にHadoopのプログラムを試しに動かしてみます。

4. 実行確認

前の章までに起動したHadoopシステムを使って、exampleとしてワード数をカウントする例題を実行してみましょう。
この例題プログラムはHadoopのインストール時に以下にJavaのjar形式で置いてあります。

/usr/share/java/hadoop/hadoop-mapreduce-examples.jar

1) まず入力データファイルを準備します。

inというディレクトリを作成し、その中に入力データファイルを置きます。

# mkdir in
# cat > in/file
 This is one line
 This is another one

2) 入力データの入ったディレクトリをHDFSにコピーします。

それぞれのdatanodeから、入力ファイルが見えるようにするためHDFSにコピーします。

# hdfs dfs -copyFromLocal in in

3) Hadoopでwordcountを実行します。

# hadoop jar /usr/share/java/hadoop/hadoop-mapreduce-examples.jar wordcount in out

実行が終わるまで待ちましょう。

4) 実行結果確認

HDFS上のoutディレクトリに結果が入っています。

# hdfs dfs -cat out/*
This	2
another	1
is	2
line	1
one	2

5. Hadoopの停止

起動したHadoopのコンポーネントをstopさせます。

# hadoop-daemon.sh stop datanode
# yarn-daemon.sh stop nodemanager
# mr-jobhistory-daemon.sh stop historyserver
# stop-yarn.sh
# stop-dfs.sh

元のページに戻る