WindowsでHadoopを動かす手順

HadoopWindowsで動かすのは、結構めんどい。
MapReduceってのが流行ってるらしいから、ちょっとウチのWindowsHadoop入れて試してみるか」くらいの気持ちでは、くじけてしまうことうけあい。
JavaをインストールしてCygwinをインストールしてSSHを設定してHadoopの設定。
このSSHの設定で泣きそうになる。特にVistaの場合。
基本的にhttp://hadoop.apache.org/core/docs/r0.19.0/quickstart.htmlに書いてあるんだけど、SSHの設定は軽くながされてる。
ということで、WindowsHadoopを動かす手順をまとめてみた。

必要なもの

Java

JREではなくJDKをダウンロードする
http://java.sun.com/javase/downloads/index.jsp

Cygwin

右側にあるリンクからsetup.exeをダウンロードする
http://cygwin.com/

Hadoop

ここからたどって適当なバージョンのhadoop-*.tar.gzをダウンロードする。tar.gzの解凍ソフトがなくても、Cygwin使うので怖くない。
http://hadoop.apache.org/core/releases.html#Download

負けない心

なんとしてもHadoopを動かすんだという強い気持ちが必要

Javaのインストール

ダウンロードしたインストーラーを起動してウィザードに従えばインストール完了

Cygwinのインストール

ダウンロードしたsetup.exeを起動すると、インストーラーが起動するので、適当にすすむ。
インストールパッケージを選ぶところで、netカテゴリにあるopensshとopensslを選択しておく。

sshdのセットアップ

Hadoopは起動スクリプトsshを使っているので、sshdが動いている必要があるので、その設定。
スタートメニューから「Cygwin > Cygwin Bash Shell」を起動。このとき、Vistaの場合は右クリックして「管理者として実行」にしないと泣くことになる。
あとは、次のコマンドを実行する。-yはすべてyesと答えるオプションなのだけど、つけずに自分で考えてもいい。結局yesを選ぶことになる。

$ ssh-host-config -y

/etc/passwdや/etc/groupのパーミッションがどうのこうの言われたら、次のようにしてパーミッションを変更したあと、もう一度ssh-host-configを実行する。

$ chmod +r /etc/passwd
$ chmod +r /etc/group

Windows XPの場合は、これでsshdがサービスとして登録されて起動する。
起動してない場合、Windowsのサービス管理から起動できるけど、次のコマンドでも起動できる。

$ cygrunsrv -S sshd

停止の場合はこう。

$ cygrunsrv -E sshd

Vistaの場合は、サービスとして登録されなかったので、通常のコマンドとして実行する

$ /usr/sbin/sshd

ここで、/var/emptyがどうのこうのと怒られるときは、所有者がおかしなことになっていたりする。
こんな感じで、所有者・グループを自分にしておく。

$ chown kishida:kishdia /var/empty


ここでsshdというアカウントが作成されるけど、Vistaでは標準のアカウント一覧などには表示されないので、気に食わなくて消したいときにはコマンドプロンプトで次のようにする。

> net user sshd /delete

パスフレーズなしでsshログインできるようにする

Hadoopを動かすときは、パスフレーズなしでsshにログインできるようにする必要がある。

$ ssh-keygen -t rsa -P ""
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys

あとは、localhostにログインしてパスフレーズの入力が必要ないことを確認する

$ ssh localhost

確認できたらsshを終わらせておく

$ exit

パスフレーズが求められたときは、なにか間違っているので確認する。ちゃんとやってたら、上に書いてることが間違いなので、ぐぐる。その後で、正しい記述を下のコメントなどにやさしい口調で書いておく。間違っても「だめじゃねぇかゴルァ」などと書かない。

Hadoopの設定

これでやっとHadoopの設定に入れる。
まずHadoopを解凍したい場所に、ダウンロードしたhadoop-*.tar.gzを置いておく。
そしたら、カレントディレクトリをその場所に移動。このとき、cygwinの作法でパスを指定する。たとえばc:\toolsにアーカイブを置いたとしたらこうなる。

$ cd /cygdrive/c/tools

あとは、tar.gzを解凍

$ tar zxf hadoop-*.tar.gz

解凍したら、その中のconf/hadoop-env.shにJDKをインストールしたフォルダを記述しておく。その場合もcygwinの作法で。こんな感じの一行を記述する。

export JAVA_HOME=/cygdrive/c/Program\ Files/Java/jdk1.6.0_11

そうすると、とりあえずスタンドアローンモードで動かせるようになるので、サンプルを試してみる。
まずHadoopのフォルダに移動しておく。

$ cd hadoop-*

あとは、Quick Startの手順どおりにすると、MapReducegrepが動く。

$ mkdir input
$ cp conf/*.xml input
$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'
$ cat output/*

二度目の実行では、outputディレクトリがあるぞと怒られるので、消しておく。

$ rm -rf output

Hadoopの起動

やはり、Hadoopは分散モードで起動しておいたほうがかわいい。
ということで、とりあえず擬似分散モードで動かしてみる。このモードは一台のマシンで、複数のプロセスで分散計算を行う。
まずは設定ファイルの記述。conf/hadoop-site.xmlを次のようにする。リモートから操作したい場合は、localhostじゃなくて実アドレスを指定しておく。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
 <property>
  <name>fs.default.name</name>
  <value>hdfs://localhost:9000</value>
 </property>
 <property>
  <name>mapred.job.tracker</name>
  <value>localhost:9001</value>
 </property>
 <property>
  <name>dfs.replication</name>
  <value>1</value>
 </property>
</configuration>


分散モードの場合、分散ファイルシステムに処理対象のファイルを置いておく必要があるので、まず分散ファイルシステムのフォーマットを行う

$ bin/hadoop namenode -format

そしたら、Hadoopのサーバーを起動

$ bin/start-all.sh

今度も、MapReducegrepを試したいんだけど、対象ファイルを分散ファイルシステムに置いておかないといけない。

$ bin/hadoop fs -put conf input

そしたら、MapReducegrepを動かしてみる。

$ bin/hadoop jar hadoop-*-examples.jar grep input output 'dfs[a-z.]+'

このときWeb管理画面でMapReduceの状況を見れる。Web管理画面はデフォルトだと次のURL。
http://localhost:50030/
ついでに、分散ファイルシステムの状況は次のURLで見れる。
http://localhost:50070/


MapReduceの処理が終わったら、結果を見てみる。分散ファイルシステム上に結果ができてるので、ダウンロードする。

$ bin/hadoop fs -get output output

そしたら表示。

$ cat output/*

分散ファイルシステム上のファイルを直接見ることもできる。

$ bin/hadoop fs -cat output/*

2回目を実行するときは、これもまたoutputディレクトリがあると怒られるので、消す。

$ bin/hadoop fs -rmr output


Hadoopを止めるなら次のコマンド

$ bin/stop-all.sh

Eclipseプラグイン

hadoopにはEclipse用のプラグインがついてる。
contrib/eclipse-plugin/hadoop-*-eclipse-plugin.jarをEclipseのpluginsフォルダにコピーすればいい。
けど、Eclipse3.2のAPIを使っているのでEclipse3.3やEclipse3.4では作成したプログラムのHadoopでの起動ができない。そのくせEclipse3.2.2では認識されない。あと、分散ファイルシステムの内容を表示できるんだけど、Windowsでは動かない。Linuxではちゃんと表示される。(追記:PATHにc:\cygwin\binを追加すると動いた)
ということで、alphaWorksで公開されているプラグインを使ったほうがいい。
http://www.alphaworks.ibm.com/tech/mapreducetools
こちらはダウンロードに登録が必要なんで鬱陶しい。
alphaWorks版の注意としては、Eclipseの設定でHadoopをインストールしたパスを指定するときはWindows形式で指定するんだけど、サーバー追加のときの設定ではcygwin形式で指定する必要があるということ。