完全分散モードでHadoopインストール

疑似分散モードでインストールができたら,次は完全分散モードです.
インストール方法をさらっと書いていますが,ここはかなりハマりました.
下記の2つのノードで構築することとします.

  • Master node (1台のみ必要)
    • namenode
    • jobtracker
  • Worker node (何台でも増やせます)
    • datanode
    • tasktracker

事前準備 (Master/Worker共通)

NTPによる時刻合わせとJDKインストールを行っておきます.
やり方は前エントリに書いてありますので,ここでは割愛.

Hadoopインストール (Master)

必要なパッケージのみインストール.

yum install hadoop-0.20
yum install hadoop-0.20-namenode
yum install hadoop-0.20-jobtracker

コンフィグ作成 (Master)

ここが正念場.設定ファイルをガリガリ編集しまくり.

# ひな形をコピー
cp -r /etc/hadoop-0.20/conf.empty /etc/hadoop-0.20/conf.my_cluster

# コンフィグの優先度をmy_cluster優先に変更
update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50
update-alternatives --display hadoop-0.20-conf

# 優先度が↓のように確認できる
hadoop-0.20-conf - status is auto.
 link currently points to /etc/hadoop-0.20/conf.my_cluster
/etc/hadoop-0.20/conf.empty - priority 10
/etc/hadoop-0.20/conf.my_cluster - priority 50
Current `best' version is /etc/hadoop-0.20/conf.my_cluster.


ここからは延々と編集作業.
master

vi /etc/hadoop-0.20/conf.my_cluster/master

# Master nodeのホスト名を記述
hadoop0


slaves

vi /etc/hadoop-0.20/conf.my_cluster/slaves

# Worker nodeのホスト名を記述
hadoop1
hadoop2
hadoop3
hadoop4
...


core-site.xml

vi /etc/hadoop-0.20/conf.my_cluster/core-site.xml

<configuration>
  <property>
    <!-- Master nodeのホスト名を記述 -->
    <name>fs.default.name</name>
    <value>hdfs://hadoop0:8020</value>
  </property>

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/var/lib/hadoop-0.20/cache/${user.name}</value>
  </property>
</configuration>


hdfs-site.xml

vi /etc/hadoop-0.20/conf.my_cluster/hdfs-site.xml

<configuration>
  <property>
    <name>dfs.replication</name>
    <value>3</value>
  </property>

  <property>
    <!-- こうしとかないと普通のユーザがHDFSにアクセスできない -->
    <name>dfs.permissions</name>
    <value>false</value>
  </property>
</configuration>


mapred-site.xml

vi /etc/hadoop-0.20/conf.my_cluster/mapred-site.xml

<configuration>
  <property>
    <!-- Master nodeのホスト名を記述 -->
    <name>mapred.job.tracker</name>
    <value>hadoop0:8021</value>
  </property>

  <property>
    <name>mapred.jobtracker.plugins</name>
    <value>org.apache.hadoop.thriftfs.ThriftJobTrackerPlugin</value>
  </property>

  <property>
    <name>jobtracker.thrift.address</name>
    <value>0.0.0.0:9290</value>
  </property>
</configuration>


Worker nodeでも全く同じファイルをつかうので,ここでコンフィグを固めておきます.
rsyncとかで同期させる場合は必要ありません.

tar zcvfp my_cluster.tar.gz /etc/hadoop-0.20/conf.my_cluster

ディレクトリ作成・初期フォーマットとデーモン起動 (Master)

ここまでできたら,あとは細々とした作業を残すのみ.
キャッシュ用ディレクトリ作成.ちなみにhadoop.tmp.dirを指定しない場合には/tmpが使われるようです.

mkdir -p /var/lib/hadoop-0.20/cache
# パーミッションも付けておきましょう
chmod 1777 /var/lib/hadoop-0.20/cache


初期フォーマット.

su -s /bin/bash - hdfs -c 'hadoop namenode -format'


デーモン起動.

service hadoop-0.20-namenode start
service hadoop-0.20-jobtracker start

Hadoopインストール (Worker)

Worker側も必要なパッケージをインストール.

yum install hadoop-0.20
yum install hadoop-0.20-datanode
yum install hadoop-0.20-tasktracker

コンフィグ反映 (Worker)

Masterで作った設定ファイルをそのままコピー.優先度もMasterと同様に反映します.

cd /
tar zxvfp path/to/my_cluster.tar.gz

update-alternatives --install /etc/hadoop-0.20/conf hadoop-0.20-conf /etc/hadoop-0.20/conf.my_cluster 50
update-alternatives --display hadoop-0.20-conf

ディレクトリ作成とデーモン起動 (Worker)

この辺りもMasterの時とほぼ同じ.Workerでは初期フォーマットは必要ありません.

mkdir -p /var/lib/hadoop-0.20/cache
chmod 1777 /var/lib/hadoop-0.20/cache

service hadoop-0.20-datanode start
service hadoop-0.20-tasktracker start

動作確認

疑似分散モードの時と同じようにPiを求めてみる.Map数を10にしてみた.

hadoop jar /usr/lib/hadoop/hadoop-0.20.2+737-examples.jar pi 10 100000

Number of Maps  = 10
Samples per Map = 100000
Wrote input for Map #0
Wrote input for Map #1
Wrote input for Map #2
Wrote input for Map #3
Wrote input for Map #4
Wrote input for Map #5
Wrote input for Map #6
Wrote input for Map #7
Wrote input for Map #8
Wrote input for Map #9
Starting Job
...
Job Finished in 91.075 seconds
Estimated value of Pi is 3.14155200000000000000