2011/01/17

Hadoopのカスタマイズ



はじめましてミツバチワークスleonです。
TECHチームの一員としてブログ連載をさせていただく機会をいただきました。

テーマはHadoopカスタマイズにします。

Hadoopは既にstoneさんが現在の運用で使っているテクニックを記事にされています。
そこで私はHadoopのカスタマイズについてご紹介させていいただくことにします。
私自身がHadoop初心者ということもあり、私は初歩からスタートさせていただこうと思います。お付き合いのほどよろしくお願いします。

Hadoopとは?から始めるのが礼儀かと思いますが、そこはwikipediaなどにお任せします。ご容赦ください。

何はともあれ立ち上がっているサービスがないと話を始められません。
そこで、最初の最初はHADOOPのセットアップ手順のご紹介です。

実際、弊社ではHadoopに十数台のサーバーを投入していますが、わかりやすいように最小限のサービス構成で紹介します。
数十台で運用していても基本は同じです。
master : hdmaster
slave : hdslave1, hdslave2
client : hdclient1

なお、いくつか前提条件があります。
・ユーザーはhadoopを用意(homedirは/home/hadoop)
・ホスト間のhadoopユーザーはパスフレーズでsshログインできる
・サーバーのスペック差分なし
・サーバーにはJava 1.4.2のJREがインストールされている

Hadoopはversion 0.18.3を使用しています。現在の最新versionは0.21.0でいまから紹介するにはずいぶん古いですね。
弊社がHadoopを導入した当時でも最新は0.18ではなかったんですが、あえて0.18.3を採用したんだそうです。
これにはちょっとした経緯があります。
stoneさんがHadoop記事でも触れてますが、我々はhadoop-streamingを利用してPerlで作成したmapperとreducerを使用しています。hadoop-streamingは当時、0.18.3が一番安定していたんだそうです。
なんでも新しいものがよいという訳ではないんですね。勉強になります。

では、Hadoopセットアップ手順です。どうぞ

1. HADOOPセットアップ

1.1 マスターセットアップ

$ ssh hdmaster
$ sudo su - hadoop
$ umask 002
$ wget http://ftp.kddilabs.jp/infosystems/apache/hadoop/core/stable/hadoop-0.18.3.tar.gz
$ tar xzf hadoop-0.18.3.tar.gz
$ mv hadoop-0.18.3 hadoop
これで/home/hadoop/hadoopに展開されています。

$ mkdir -p /home/hadoop/tmp
$ mkdir -p /home/hadoop/filesystem/dfs
$ mkdir -p /home/hadoop/logs
Hadoopで使用するディレクトの作成です。

$ vi /home/hadoop/hadoop/conf/masters
hdmaster
マスターのhostです。

$ vi /home/hadoop/hadoop/conf/slaves
hdslave1
hdslave2
スレーブのhost一覧です。スレーブを追加したらこのファイルにhostを追加していきます。

$ vi hadoop/conf/hadoop-env.sh
>>>
export JAVA_HOME=/usr/java/latest

export HADOOP_LOG_DIR=/home/hadoop/logs
>>>
Hadoop環境にJavaのパスを設定します。

$ vi hadoop/conf/hadoop-default.sh
>>>

<property></property>
  <name>hadoop.tmp.dir</name>
  <value>/home/hadoop/tmp/hadoop-${user.name}</value>
<description>A base for other temporary directories.</description>

>>>
Hadoopの一時ディレクトリのパスを設定します。

$ vi hadoop/conf/hadoop-site.sh
>>>
<configuration>

<property>
  <name>fs.default.name</name>
  <value>hdfs://hdmaster:9000</value>
</property>

<property>
  <name>mapred.job.tracker</name>
  <value>hdmaster:9001</value>
</property>

<property>
  <name>dfs.name.dir</name>
  <value>/home/hadoop/filesystem/dfs/name</value>
</property>

<property>
  <name>dfs.data.dir</name>
  <value>/home/hadoop/filesystem/dfs/data</value>
</property>

<property>
  <name>mapred.system.dir</name>
  <value>/home/hadoop/filesystem/mapred/system</value>
</property>

<property>
  <name>mapred.local.dir</name>
  <value>/home/hadoop/filesystem/mapred/local</value>
</property>

<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>

<property>
  <name>mapred.job.tracker.handler.count</name>
  <value>20</value>
</property>

<property>
  <name>mapred.map.tasks</name>
  <value>50</value>
</property>

<property>
  <name>mapred.reduce.tasks</name>
  <value>10</value>
</property>

</configuration>
>>>
サービス起動に必要な最低限の設定です。

1.2スレーブ&クライアントのセットアップ

$ ssh hdmaster
$ sudo su - hadoop
$ rsync --delete --progress -av hadoop hdslave1:
$ rsync --delete --progress -av hadoop hdslave2:
$ rsync --delete --progress -av hadoop hdclient:
基本的にスレーブとクライアントは同じ設定です。今後、スレーブやクライアントを増えていくことが予想される場合、以下のようにスクリプト準備しておくと便利です。
$ vi /home/hadoop/rsync.sh
#!/bin/sh

HOST_LIST="hdslave1, hdslave2, hdclient1"

cd /home/hadoop
for host in $HOST_LIST ; do
  rsync --delete --progress -av hadoop $host:
done
$ chmod 755 /home/hadoop/rsync.sh

1.3 サービスの起動

$ ssh hdmaster
$ sudo su - hadoop
$ /home/hadoop/hadoop/bin/hadoop namenode -format
$ /home/hadoop/hadoop/bin/bin/start-all.sh
namenodeのフォーマットはセットアップの際に1度行っておけばOKです。

1.4 動作確認

$ ssh hdclient
$ sudo su - hadoop
$ /home/hadoop/hadoop/bin/hadoop jar hadoop-0.18.3-examples.jar sudoku src/examples/org/apache/hadoop/examples/dancing/puzzle1.dta

これで準備OKです。
なお、ここまでは先人の叡智です。
私には既に動いているHadoopが与えられました。

私がHadoopに初めて触ったのはスレーブ追加作業からでして、そこで初ハマりがありました。
HADOOPスレーブの追加はスレーブのセットアップ後、マスターでサービスを再起動するだけだと教えていただいたのですが、サービス停止のスクリプトを実行してもスレーブで立ち上がっているjavaプロセスが終了しなかったんです。
そのときは、javaプロセスを直接killしちゃったんです。もう時効ですよね。

このあともHadoopのカスタマイズで四苦八苦を繰り返しています。
次回からは実体験のカスタマイズでハマったこと、気がついたことをご紹介していきたいと思います。

それでは