hshinjiの日記

2010-03-25

Hadoopインストール

Hadoopインストールに手間取ったので、備忘録。


前提条件

以下の環境で動作させています。

また、Hadoopのマスターノードのホスト名を「hmaster」、スレーブを「hslave1, hslave2, ...」とします。


ゲストOSインストールCentOS

KVM上で動作するCentOSのイメージを一つ作成します。各ノードはこのイメージのコピーを使用します。

再起動後の最初の設定では、FirewallとSELinuxを無効にしておきます。

その他のCentOSインストール自体の説明はここでは省略しますので、あしからず。

ログイン後、ホスト側から扱い易いように、コンソールの設定をしておきます。/etc/inittabに、"co:2345:respawn:/sbin/agetty ttyS0 115200 vt100-nav"を追加しておけば良いです。これでホスト側から「virsh console <ホスト名>」でアクセスできます。

また、OSアップデートしておきましょう。


共通項目のインストール・設定

SunのJavaインストール

ここからJDK(現在はJDK 6 Update 18)をダウンロードし、インストールします。(インストールの詳細は略)

Hadoopインストール

yumリポジトリを登録して、「hadoop-0.20」をインストールします。(rootで作業します。)

# cd /etc/yum.repos.d/
# wget http://archive.cloudera.com/redhat/cdh/cloudera-testing.repo
# yum -y install hadoop-0.20

この後、仮想マシンを終了させます。


マスターノードの設定

マスターノード用の仮想マシンの準備

まずホスト上で、作成した仮想マシンイメージをコピーしてマスターノード用の仮想マシンイメージを作成します。次のコマンドを使います。

virt-clone -o 元のゲスト名 -n 新しいゲスト名 -f ディスクイメージ名

例えば、

$ sudo virt-clone -o centos54 -n hmaster -f /var/lib/libvirt/images/hmaster.img

とします。

その後、マスターノード仮想マシンを起動し、コンソールで接続します。

$ virsh start hmaster
$ sudo virsh console hmaster

一般ユーザでログインした後、suコマンドでrootにスイッチします。

ネットワークの設定

まず、ネットワーク関連を設定します。

仮想マシンをコピーした際に作成される ifcfg-eth0.bak は削除し、ifcfg-eth0 に、ダイナミックDNSにホスト名を登録するための設定をします。

# rm /etc/sysconfig/network-scripts/ifcfg-eth0.bak
# echo 'DHCP_HOSTNAME=hmaster' >> /etc/sysconfig/network-scripts/ifcfg-eth0

また、/etc/sysconfig/network に書かれたホスト名を編集します。

# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=hmaster
#

あと、/etc/hosts 内の127.0.0.1は、「localhost.localdomain localhost」だけになるようにします。

インストール時にホスト名を設定したりすると、ここに追記されたりするので)

ここで一旦ネットワーク再起動しましょう。

# /etc/init.d/network restart
Hadoopの設定

ここでは、/etc/hadoop/conf/ 以下のファイルを編集します。

  • core-site.xml
<configuration>
  <property>
    <name>fs.default.name</name>
    <value>hdfs://hmaster:8020</value>
  </property>
</configuration>
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>  ← スレーブノードの数(ここでは3つ)
  </property>
</configuration>
  • mapred-site.xml
<configuration>
  <property>
    <name>mapred.job.tracker</name>
    <value>hmaster:8021</value>
  </property>
</configuration>
  • masters
hmaster
  • slaves
hslave1
hslave2
hslave3

次にHDFSのフォーマットを行います。

# sudo -u hadoop hadoop-0.20 namenode -format

最後に、起動時にHadoopデーモンを開始出来るように設定します。

# chkconfig --add hadoop-0.20-namenode
# chkconfig --add hadoop-0.20-jobtracker

NFSの設定

/etc/hadoop/ 以下をスレーブと共有できるよう、NFSの設定を行います。

まず、/etc/exports を編集します。

/etc/hadoop     hslave*(rw,no_all_squash,sync)

その後、NFSデーモンを起動し、起動時に開始できるようにします。

# /etc/init.d/nfs start
# chkconfig nfs on

ここまで完了したら再起動し、スレーブの設定に進みましょう。


スレーブノードの設定

ここではhslave1のスレーブノードについて説明します。他のhslave2, hslave3は、ホスト名を変更して作業してください。

マスターノードと同様、仮想マシンイメージをコピーします。

$ sudo virt-clone -o centos54 -n hslave1 -f /var/lib/libvirt/images/hslave1.img

その後、スレーブノード仮想マシンを起動し、コンソールで接続します。

$ virsh start hslave1
$ sudo virsh console hslave1

一般ユーザでログインした後、suコマンドでrootにスイッチし、マスターノードと同じようにネットワーク関連を設定します。

# rm /etc/sysconfig/network-scripts/ifcfg-eth0.bak
# echo 'DHCP_HOSTNAME=hslave1' >> /etc/sysconfig/network-scripts/ifcfg-eth0

/etc/sysconfig/network に書かれたホスト名を修正します。

# cat /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=hslave1
#

そして一旦ネットワーク再起動します。

# /etc/init.d/network restart
NFSの設定

起動時にマスターノードの/etc/hadoopをスレーブの/etc/hadoopにマウントするようにします。

# rm -rf /etc/hadoop/*
# echo 'hmaster:/etc/hadoop /etc/hadoop nfs defaults 0 0' >> /etc/fstab
Hadoopデーモンの設定

起動時にHadoopデーモンを開始出来るように設定します。

# chkconfig --add hadoop-0.20-datanode
# chkconfig --add hadoop-0.20-tasktracker

そしてリブートし、他のマスターノードについても同じ設定を行います。


確認

Web経由でマスターノードにアクセスし、確認します。


スレーブノードの追加

  1. まず /etc/hadoop/conf/hdfs-site.xml で設定した数を必要な分だけ増やす。
  2. /etc/hadoop/conf/slaves にスレーブノードを追加する。
  3. スレーブノードを上記のとおりに作成し、リブートする。
Connection: close