HadoopをWindowsで動かすのは、結構めんどい。
「MapReduceってのが流行ってるらしいから、ちょっとウチのWindowsにHadoop入れて試してみるか」くらいの気持ちでは、くじけてしまうことうけあい。
JavaをインストールしてCygwinをインストールしてSSHを設定してHadoopの設定。
このSSHの設定で泣きそうになる。特にVistaの場合。
基本的にhttp://hadoop.apache.org/core/docs/r0.19.0/quickstart.htmlに書いてあるんだけど、SSHの設定は軽くながされてる。
ということで、WindowsでHadoopを動かす手順をまとめてみた。
必要なもの
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を動かすんだという強い気持ちが必要
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の手順どおりにすると、MapReduce版grepが動く。
$ 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
今度も、MapReduce版grepを試したいんだけど、対象ファイルを分散ファイルシステムに置いておかないといけない。
$ bin/hadoop fs -put conf input
$ 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形式で指定する必要があるということ。