IDCF Tech-Blog

読者です 読者をやめる 読者になる 読者になる

IDCF テックブログ

クラウド・ビッグデータ・データセンターを提供するIDCフロンティアの公式エンジニアブログ

分散処理基盤Hadoopを試してみる

※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。

今回は、分散処理フレームワークのHadoopをIDCフロンティア セルフクラウド(以下、セルフクラウド)で使用する方法を紹介します。インストールから設定ファイルの編集、動作確認、そして最後にSlave nodeの追加方法についても説明します。

 

Hadoop

Hadoopとは

まずは、簡単にHadoopの説明をいたします。

HadoopはJavaによる分散処理フレームワークで、簡単に大量のデータを分散して処理することができます。 ビッグデータの活用が叫ばれる今、それを処理する技術としてHadoopも注目を集めています。 また、Hadoopはオープンソースソフトウェアであり、Apache Foundationのトップレベルプロジェクトとして開発されています。

Hadoopは基本的な機能として、分散ファイルシステムであるHDFS(Hadoop Distributed File System)と分散処理を担うMapReduceの2つを持っています。 基本構成は下の図のようになります。

今回はセルフクラウドでこの構成のHadoopシステムを構築してみます。

インストール

Master、Slaveそれぞれ同じように設定していきます。 (所々MasterとSlaveで異なる部分があるので、注意してください。Master、Slaveが書いてない部分は基本的に共通の設定を行ってください。)

まずはMaster、Slave用にそれぞれ仮想マシンを1台ずつ作成しておいてください。 今回、仮想マシンのテンプレートには[LATEST] CentOS 6.4 64-bitを選びました。

1. CDH4リポジトリ追加

また、今回はCloudera社のCDH(Cloudera's Distribution for Hadoop)というHadoopのディストリビューションを利用します。 CDHを利用すると、Hadoop関連のソフトウェアをパッケージとして簡単にインストールすることができます。

CDHを利用するためにはリポジトリを追加する必要があります。 次のコマンドで追加してください。?今回使用するバージョンはCDH4になります。

# wget http://archive.cloudera.com/cdh4/redhat/6/x86_64/cdh/cloudera-cdh4.repo -P /etc/yum.repos.d/

2. JDKインストール

HadoopはJavaのソフトウェアなので、JDKが必要となります。 CDH4がサポートしているのはOracle版のみとなりますので、Oracleから最新版のJDKをダウンロードして、インストールしてください。

# rpm -ivh jdk-7u25-linux-x86.rpm

また、PATHも設定しておきます。

# vi /etc/profile
...
export JAVA_HOME="/usr/java/jdk1.7.0_25" # 最終行に追加
export PATH="$JAVA_HOME/bin:$PATH"

3. Hadoopインストール

Master Node

Master NodeにはNameNodeとJobTrackerをインストールします。

CDH4のリポジトリを追加してあるので、yumで簡単にインストールが可能です。

# yum -y install hadoop-hdfs-namenode hadoop-0.20-mapreduce-jobtracker

Slave node

Slave NodeにはDataNodeとTaskTrackerをインストールします。

# yum -y install hadoop-hdfs-datanode hadoop-0.20-mapreduce-tasktracker

4. alternatives

CDH4ではalternativesで設定を切り替えられるようになっています。 設定は/etc/hadoopにあるディレクトリごとに管理されており、シンボリックリンクでディレクトリを切り替えることにより、複数の設定を使い分けることができます。

今回は新しく設定を作成し、alternativesに登録します。

まず、現在の設定を確認してみましょう。

# alternatives --display hadoop-conf
hadoop-conf -ステータスは自動です。
リンクは現在 /etc/hadoop/conf.empty を指しています。
/etc/hadoop/conf.empty - 優先項目 10
現在の「最適」バージョンは /etc/hadoop/conf.empty です。

現在はconf.emptyというディレクトリの設定が適用されていることがわかります。

次に新しく設定用のディレクトリを作成し、優先度20で登録します。 alternatives --installの引数は順に、リンク先、名前、リンク元、優先度、となっています。

# cp -r /etc/hadoop/conf.empty/ /etc/hadoop/conf.my
# alternatives --install /etc/hadoop/conf hadoop-conf /etc/hadoop/conf.my 20
# alternatives --display hadoop-conf
hadoop-conf -ステータスは自動です。
リンクは現在 /etc/hadoop/conf.my を指しています。
/etc/hadoop/conf.empty - 優先項目 10
/etc/hadoop/conf.my - 優先項目 20
現在の「最適」バージョンは /etc/hadoop/conf.my です。

新しく登録したディレクトリを指していればOKです。

5. core-site.xml

先ほど作成したディレクトリ内のcore-site.xmlを編集します。

core-site.xmlはHadoopの基本的な設定ファイルになります。

# vi /etc/hadoop/conf.my/core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://i-xxxx-00001-VM:8020</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop</value>
</property>
</configuration>

fs.defaultFSにはMasterNodeのホスト名を設定してください。8020はNameNodeのポート番号になります。 セルフクラウド上ではデフォルトで上記のようなホスト名がDNSに登録されているので、それを登録すればOKです。

ローカル環境などで試す場合は/etc/hostsなどに適当なものを登録してください。

hadoop.tmp.dirには様々なファイルが置かれることになり、あらかじめ作成しておく必要があります。
また、このディレクトリにアクセスするユーザはhdfsになるので、オーナーも変更しておきます。

# mkdir /tmp/hadoop
# chown hdfs. /tmp/hadoop

6. hdfs-site.xml

hdfs-site.xmlではHDFSの設定を記述します。
これはMasterとSlaveで異なる内容になります。

Master Node

# vi /etc/hadoop/conf.my/hdfs-site.xml
<configuration>
<property>
<name>dfs.permissions.superusergroup</name>
<value>hadoop</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>${hadoop.tmp.dir}/dfs/name</value>
</property>
</configuration>

Slave node

# vi /etc/hadoop/conf.my/hdfs-site.xml
<configuration>
<property>
<name>dfs.permissions.superusergroup</name>
<value>hadoop</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>${hadoop.tmp.dir}/dfs/data</value>
</property>
</configuration>

7. HDFS起動

NameNode、DataNodeを起動し、動作を確認します。

Master Node

NameNodeの初期化を行い、起動します。

# sudo -u hdfs hadoop namenode -format
# service hadoop-hdfs-namenode start
# service hadoop-hdfs-namenode status

Slave Node

# service hadoop-hdfs-datanode start
# service hadoop-hdfs-datanode status

状態確認

NameNodeを起動した状態で、50070ポートにアクセスするとWebで状態を確認することができます。
ファイアーウォールやポートフォワーディングの設定を行い、ブラウザでMaster Nodeの50070ポートにアクセスしてみてください。

設定方法については、IDCFクラウドご利用ガイドをご覧ください。

Cluster SummaryのLive Nodesが1になっていると、DataNodeと接続ができています。

動作確認

NameNodeで以下を実行してみてください。HDFS上にディレクトリを作成し、ローカルにあるファイルをHDFSにコピーします。

# su - hdfs
$ touch test.txt
$ hadoop fs -mkdir /test
$ hadoop fs -put test.txt /test
$ hadoop fs -ls -R /
$ exit

HDFS上にディレクトリが作成され、ファイルがコピーされていることがわかります。

8. MapReduce起動

次に、MapReduceを起動させます。

まず、設定ファイルを作成します。

# vi /etc/hadoop/conf.my/mapred-site.xml
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl" ?>
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>i-xxxx-00001-VM:8021</value>
</property>
</configuration>

mapred.job.trackerにはMaster Nodeのホスト名を指定してください。

MapReduceで使用されるディレクトリを作成します。

# mkdir /tmp/hadoop/mapred
# chown mapred. /tmp/hadoop/mapred

次に、HDFS上に必要なディレクトリを作成していきます。

# sudo -u hdfs hadoop fs -mkdir /tmp
# sudo -u hdfs hadoop fs -chmod -R 1777 /tmp
# sudo -u hdfs hadoop fs -mkdir -p /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
# sudo -u hdfs hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
# sudo -u hdfs hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred
# sudo -u hdfs hadoop fs -mkdir -p /tmp/hadoop/mapred/system
# sudo -u hdfs hadoop fs -chown -R mapred /tmp/hadoop/mapred

Master Node

# service hadoop-0.20-mapreduce-jobtracker start
# service hadoop-0.20-mapreduce-jobtracker status

Slave Node

# service hadoop-0.20-mapreduce-tasktracker start
# service hadoop-0.20-mapreduce-tasktracker status

状態確認

HDFSと同じように、JobTrackerの50030ポートにアクセスすると状態を確認することができます。 Cluster SummaryのNodesが1になっていればOKです。

 

動作確認

実際にプログラムを動かして、動作確認を行います。

MapReduceをインストールすると付属しているサンプルプログラムがあるので、それを実行します。

# cd /usr/lib/hadoop-0.20-mapreduce
# sudo -u hadoop jar hadoop-examples.jar pi 4 1000

ここで先ほどの50030にアクセスすると、Jobが走っているのが確認できます。

今回実行したのは円周率を計算するものですが、他にも様々な機能があるのでいろいろ試してみてください。

9. Slave Node増設

次は、セルフクラウドの機能を使用し、Slave Nodeを増やします。 具体的には、Slave Nodeの仮想マシンからテンプレートを作成し、そのテンプレートから新たなSlave Nodeを作成します。

テンプレートからSlaveを作成していくことで、インストールや設定の手間を省くことができます。

テンプレート作成

テンプレートを作成する前に、/etc/udev/rules.d/70-persistent-net.rulesを削除しておきます。 詳しくはIDCFクラウドFAQ(よくあるご質問)をご覧ください。

# rm -f /etc/udev/rules.d/70-persistent-net.rules

次に、Slave Nodeの仮想マシンを停止してください。

停止できたら、セルフクラウドのポータル上で、マイリソース>ボリュームでSlave Nodeのボリュームを選択し、メニューから「テンプレート作成」をクリックしてください。

詳しいテンプレート作成方法については、ご利用ガイド(スナップショット・テンプレート)をご覧ください。

テンプレート作成が終わりましたら、オリジナルのSlave Nodeを起動し、DataNode、TaskTrackerも起動しておきましょう。

追加Slave Node作成

追加のSlave Node用の仮想マシンを作成します。 仮想マシン作成画面で、マイテンプレートから先ほど作ったテンプレートを選択し、仮想マシンを作成してください。

作成できたら、オリジナルのSlave Nodeから引き継いでしまったデータを削除します。 この作業を行わないと、DataNodeのIDが競合してしまい、正常にクラスタを組むことができません。

# service hadoop-hdfs-datanode stop
# service hadoop-0.20-mapreduce-tasktracker stop
# rm -rf /tmp/hadoop/dfs/data
# service hadoop-hdfs-datanode start
# service hadoop-hdfs-datanode status
# service hadoop-0.20-mapreduce-tasktracker start
# service hadoop-0.20-mapreduce-tasktracker status

この状態でNameNodeのWeb画面を見ると、Nodeが増えていることが確認できます。

先ほどと同じように、NameNodeでサンプルプログラムを実行すると複数ノードでMapReduceが行われていることが確認できます。

# cd /usr/lib/hadoop-0.20-mapreduce
# sudo -u hdfs hadoop jar hadoop-examples.jar pi 4 1000

 

長くなってしまいましたが、今回は以上で終了です。

クラウド上だとノードをどんどん増やして、計算速度を上げていくことができます。 是非、Hadoopの分散処理でクラウドの神髄を味わってみてください。以上、渡辺からでした。

Copyright © IDC Frontier Inc.