※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。
今回は、分散処理フレームワークのHadoopをIDCフロンティア セルフクラウド(以下、セルフクラウド)で使用する方法を紹介します。インストールから設定ファイルの編集、動作確認、そして最後にSlave nodeの追加方法についても説明します。
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の分散処理でクラウドの神髄を味わってみてください。以上、渡辺からでした。