2009年11月11日水曜日

4台構成のHadoopを100分で試してみる(CentOS + Cloudera)

概要
・4台のLinux環境で、簡単に、Hadoopを体験してみる方法です。
・HDFSにちょっとファイルを置いてみたり、少しMapReduceジョブを動かしてみます。
・マスター1台、スレーブ3台なので、hadoop度が少し高いです。(あとは、セカンダリーマスターを動かせば、普通に使えます)
・CentOSとCloudera社版のディストリビューションパッケージCDH3(無料)を利用します。(rpmパッケージなので、インストール・アンインストール、サービス起動・停止等が楽です)

その他の記事

Hadoop(1台構成)HBase,Hive,Pig,HUE,Oozie等(1台構成)Hadoop(複数台構成)
CentOSこちらHBase,Hive,Pig, HUE(旧Cloudera Desktop), Oozieこちら
UbuntuこちらHBase,Hive,Pig,HUE(旧Cloudera Desktop)



(参考) Cloudera社のHadoopパッケージの情報 http://archive.cloudera.com/docs/

必要なもの
・CentOS5.4のLinux環境4台(CentOSの他バージョンや、Fedora、Redhat等でも大丈夫だと思います)
・インターネット接続
・Sun社Javaパッケージ(パッケージファイルをインターネットから取得)
・Cloudera社のCDH3のHadoopパッケージ(yumでインターネットからインストール)

構成
4台のHadoopクラスターです。
・マスター1台: nm01
・スレーブ3台: ns10, ns11, ns12

作業手順

0. 準備

0-0. サーバー名

ここで利用するサーバー/サーバー名は以下の4つです。
nm01
ns10
ns11
ns12

すべてのサーバー(nm01, ns10, ns11, ns12)と作業クライアント(あれば)で、名前を使えるようにしておきます。(簡単に試すには、/etc/hostsを使う方法がいいかもしれません)

0-1. Sun社Javaパッケージの取得
http://java.sun.com/javase/downloads/にて、
 Java SE Development Kit (JDK)の項目の、
 JDK 6 Update 17を、[Download]します。
Linuxの人は、Java SE Development Kit 6u17(jdk-6u17-linux-i586-rpm.bin)
Linux x64の人は、Java SE Development Kit 6u17(jdk-6u17-linux-x64-rpm.bin)
ファイルは、Linux環境内のどこかのディレクトリにおいておきます。

1. インストール: 全サーバー共通(nm01, ns10, ns11, ns12)

・4台のサーバーすべてで同じ作業をします。
・設定ファイルも共通です。
・起動させるサービスのみ異なるので、そこは別途行うこととします。
・工夫すると、作業が楽になるかもしれません。
(仮想環境なら1台に入れてコピーするとか、kickstartで自動インストールするとか、dshなどでまとめて作業するとか)

作業は、
・Javaのパッケージインストール
・Hadoop-0.20のパッケージインストール
・Hadoopの設定ファイルの作成と配置

Linux環境にて、rootで作業します。

1-1. Sun社のJava(少し面倒ですが、Sun社のものが必要です。)
ダウンロードパッケージのあるディレクトリで、
sh SUN社サイトからダウンロードしたファイル
(例)
i586なら> sh jdk-6u17-linux-i586-rpm.bin
x64なら> sh jdk-6u17-linux-x64-rpm.bin

とし、指示に従います。
結果例
...略...
Java(TM) SE Development Kit 6 successfully installed.
...略...
Press Enter to continue.....


Done.

確認します。
java -version

結果例
java version "1.6.0_17"
Java(TM) SE Runtime Environment (build 1.6.0_17-b04)
Java HotSpot(TM) 64-Bit Server VM (build 14.3-b01, mixed mode)

1-2. Hadoop

1-2-a. Cloudera社リポジトリの追加

cd /etc/yum.repos.d
wget http://archive.cloudera.com/redhat/cdh/cloudera-cdh3.repo

(参考1) http://archive.cloudera.com/docs/_yum.html

1-2-b. Hadoopをインストール

yum -y install hadoop-0.20

結果例
...略...
Installed:
hadoop-0.20.noarch 0:0.20.1+152-1

Complete!

1-3. Hadoopの設定ファイル一式を作成

1-3-1. 設定ディレクトリーの作成と設定

設定ディレクトリーまるごと、サンプルのコピーで、作成します。
alternativeの仕組みで管理します。ここでは、設定ファイルのディレクトリは、/etc/hadoop-0.20/confですが、実体は/etc/hadoop-0.20/conf.test1です。

cp -r /etc/hadoop-0.20/conf.empty /etc/hadoop-0.20/conf.test1
alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.test1 20

確認
alternatives --display hadoop-0.20-conf

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

1-3-2. 設定ファイルの編集

/etc/hadoop-0.20/conf.test1/内で、設定ファイルを変更します。
cd /etc/hadoop-0.20/conf.test1

・mastersファイル
echo nm01 > masters

・slavesファイル
cat << EOF > slaves
ns10
ns11
ns12
EOF

・hadoop-env.shファイル
意外と、いじらなくてよいです。(問題があればJavaの設定を施します。例えばCentOSではexport JAVA_HOME=/usr/java/default)

・core-site.xmlファイル
cat << EOF > core-site.xml
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://nm01:8020</value>
</property>
</configuration>
EOF

・hdfs-site.xmlファイル
cat << EOF > hdfs-site.xml
<configuration>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
</configuration>
EOF

・mapred-site.xmlファイル
cat << EOF > mapred-site.xml
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>nm01:8021</value>
</property>
</configuration>
EOF

2. インストール: 各サーバーにて

マスターノード(nm01)と、スレーブノード(ns10, ns11, ns12)で、それぞれ異なる設定をします。
起動させるサービスやFirewall設定が異なります。

2-1. マスターノード(nm01)

マスターノード(nm01)にて、rootで作業します。

HDFSフォーマット作業
sudo -u hadoop hadoop-0.20 namenode -format

サービス起動
service hadoop-0.20-namenode start
service hadoop-0.20-jobtracker start

サービス登録
chkconfig --add hadoop-0.20-namenode
chkconfig --add hadoop-0.20-jobtracker

Firewall設定:ここでは以下をあけます。
50030:tcp 50070:tcp 8020:tcp 8021:tcp
(ローカルな環境ではOffにしてしまうのも、いいかもしれません。)

2-2. スレーブノード(ns10, ns11, ns12)

スレーブノード(ns10, ns11, ns12)にて、rootで作業します。

サービス起動
service hadoop-0.20-datanode start
service hadoop-0.20-tasktracker start

サービス登録
chkconfig --add hadoop-0.20-datanode
chkconfig --add hadoop-0.20-tasktracker

Firewall設定:ここでは以下をあけます。
50010:tcp 50060:tcp 50075:tcp
(ローカルな環境ではOffにしてしまうのも、いいかもしれません。)

3. 確認・お試し

3-1. ブラウザ(Web UI)で様子を見てみる。

HDFSの様子を見てみる
http://nm01:50070/

MapReduceの様子を見てみる
http://nm01:50030/

2-2. HDFSを試す。

マスターノード(nm01)にて、rootで試してみます。

まず、HDFS上に、rootさん用のフォルダを作ります。
sudo -u hadoop hadoop-0.20 fs -mkdir /user/root
sudo -u hadoop hadoop-0.20 fs -chown root /user/root

2-2-a. フォルダを作ってみる
hadoop-0.20 fs -mkdir TESTFOLDER01

2-2-b. ファイルを置いてみる

ローカルにテストファイル(/var/tmp/test)を作ります。
cat << OTAMESHI > /var/tmp/test
hello hadoop world
OTAMESHI

ローカルのテストファイルをHDFS上にコピーしてみます。
hadoop-0.20 fs -put /var/tmp/test TESTFOLDER01

2-2-c. ファイルを取り出してみる
2-2-c-1. HDFS上のファイルをcatしてみます。
hadoop-0.20 fs -cat TESTFOLDER01/test

2-2-c-2. HDFS上のファイルをローカル(/var/tmp/test2)に、取り出してみます。
hadoop-0.20 fs -get TESTFOLDER01/test /var/tmp/test2

ローカルに取り出したものの中身を確認します。
cat /var/tmp/test2

2-2-d. 今一度、ブラウザ(Web UI)からHDFSの様子を見てみる

http://nm01:50070/から
一番上のリンク"Browse the filesystem"から、
フォルダを、
user/root/TESTFOLDER01/test
と辿ってみます。

2-2-e. もっとHDFSでいろいろしてみるには、
ヘルプを読みます。
hadoop-0.20 fs -help

2-3. MapReduceを試す。

マスターノード(nm01)にて、rootで試してみます。

hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-*-examples.jar pi 20 2000

結果例
...略...
うっすらmapしてreduceします。
...略...
Job Finished in 77.006 seconds
Estimated value of Pi is 3.14140000000000000000

円周率が計算されました。

本当は3.14159...なので、たいした精度じゃないです。
最後の引数を多くすると精度が上がるようです。
最後から二番目の引数がMapの数です。

他のMapReduceのサンプルは、
hadoop-0.20 jar /usr/lib/hadoop-0.20/hadoop-*-examples.jar


ずっとあそぶには、セカンダリーマスターを動かしましょう。
--
終わり

0 件のコメント:

コメントを投稿