Windows 8.1で Hadoop 2.6.0 をビルドする

Linux で動かせばいいようなものだが、なかには、会社の制約で Windows しか利用できない人が、Hadoop や関連技術を勉強したいこともあるだろうということで。Windows 8.1 でビルドしているが、Windows 7 でも同様にビルドできる。ただし、x64版のみ。少し調整すれば x86 でもビルドできるはずだが、Hadoop はメモリ食いなので、どのみち x86 では使い物にならないので。
ちなみに、Hadoop 2.6.0 は、2.4.1の頃には、パッチが必要だった OSXでもすんなりビルドできる。


ビルドするより、すぐに動かしたい場合、以下から、Hadoop 2.6.0やそれに対応したHive、Sparkなども含め、ビルド済みバイナリを入手できる。
(http://sourceforge.jp/projects/win-hadoop/releases/62852)


## 必要なもの
* Windows 8.1 for **x64**
* Visual Studio 2010 Express (C++のみ)
* Visual Studio 2010 SP1
* Windows SDK for Windows **7 (7.1)**
* JDK7 (x64)
* Maven 3.2.3
* Ant 1.9.3
* Protocol Buffer Compiler 2.5.0
* CMake 3.0.2
* MinGW32
* Zlib 1.2.8
* Hadoop 2.6.0 ソース

注意として、Windows SDK のインストールが失敗することがある。その場合は、VC++2010再配布パッケージ x86 と x64 の両方をアンインストールしてから、セットアップを開始し、コンポネントの選択で Visual C++ Compiler のチェックをはずしてインストールする。インストールがうまくいったら、別途ダウンロードした、VC++2010再配布パッケージとWindows SDK7.1用VC++更新(KB2519277)をインストールする。
Visual Studio 2010 Express は、SP1 をインストールしていないと、ビルド途中で、ヘッダが見つからないようなエラーがでる。

JDK7 はセットアップでインストール。javac にPATHを通す。ビルド時には気にしなくていいが、ビルドした Hadoop を動かすときに **JAVA_HOMEに、空白(0x20)を含むパスを設定できない**ので、`JAVA_HOME=C:\Progra~1\Java\jdk1.7.0_71` などのようにするほうがよい。

Maven, Ant は、適当に展開して、PATHを通す。lib をCLASSPATHに追加する。

Protocol Buffer コンパイラは、https://code.google.com/p/protobuf/downloads/detail?name=protoc-2.5.0-win32.zip からビルド済みのものをダウンロードすると、protoc.exe だけがあるので、PATHを通すのが面倒なので C:\Windows にコピーする。

CMake も http://www.cmake.org/files/v3.0/cmake-3.0.2-win32-x86.zip からビルド済み(x86でよい)のものをダウンロードし、適当に展開して、binにPATHを通す。

MinGW32 は、msys の sh.exe や tar.exe だけを使いたいだけなので、msys-git や cygwin などでもよいはずだが、ビルドは、cmd.exe 上で行うので、そこから利用できる必要がある。一時的に使いたいだけなので、今回は、ビルド前に手作業で、msys のパス (C:\MinGW\msys\1.0\bin)をPATHに追加する（PATHの先頭に追加するほうが問題が出にくいと思う）。

このほか、本当は Zlib も必要だが、少し動かすぐらいならば、なくても動作確認までできる。Zlib は、ビルド済みバイナリーが x86 のみしかダウンロードできないので、別途、x64 用を自分でビルドする。

Zlibを使うには、
[www.zlib.net](http://www.zlib.net)より[zlib128.zip](http://zlib.net/zlib128.zip)をダウンロードし、展開したら、Windows SDKのコマンドプロンプトでzlibのフォルダにいき、以下を実行する。

```
nmake -f win32\Makefile.msc
```

zlib1.dllができているはずなので、C:\Windows\System32 にコピーして、環境変数 ZLIB_HOMEに展開したフォルダを指定しておく。
（必要な includeファイル、libファイルは zconf.h、zlib.h、zdll.lib、zlib.lib なので、適当なフォルダにコピーしておくとよい）

## ビルド
Hadoop はパス名が長いものがあるので、`%USERHOME%` 以下のディレクトリに展開すると失敗するので、C:\WORK などの C:\ 直下か１つ下にソースを展開する。

Windows SDK のコマンドプロンプトから、ビルド開始するのだが、Windows 8.1 で、Windows7 以前のスタートメニューは、C:\ProgramData\Microsoft\Windows\スタートメニュー\プログラム にあるので、そこから、Microsoft Windows SDK v7.1 の Command Prompt を起動する。
デフォルトで、x64 Debug ターゲットで起動するので、**`setenv.cmd /x64 /Release`** として、Release ターゲットに変更する。
テキストの色が気になる場合は、`color 7` として、元の色に戻す。

この時点で、javac, mvn, ant, protoc, cmake, sh, tar にPATHが通っていないなら、追加する。
利用しているネットワークが、PROXY環境のときには、`MAVEN_OPTS`や `ANT_OPTS` に適宜PROXYを設定する（`set ANT_OPTS=-Dhttp.proxyHost=proxy.yourdomain -Dhttp.proxyPort=8080`)。

Hadoop のビルドに必要な環境変数を設定する。

```
set Platform=x64
set TARGET_CPU=amd64
```

Hadoop 2.6.0 のソースフォルダに移動し、以下を実行。

```
cd c:\work\hadoop-2.6.0-src
mvn clean
cd hadoop-maven-plugins
mvn install
cd ..
```

あとは、以下のコマンドで、パッケージのビルドを一気に行う。

```
mvn -e package -Pdist,native-win -DskipTests -Dtar
```

途中で、エラーがでて、詳しく出力を確認したいときは、`mvn -e -X …` とする。エラーがでるのは、ほぼ、native ビルドの箇所だと思うが、上記の環境構築ができていれば、エラーは起きないはず。
コマンドプロンプトをスタートメニュー内の Windows SDK コマンドプロンプトを使っていないと、後から setenv.cmd で Windows SDKビルド環境を設定したコマンドプロンプトではエラーが起きる事がある。おかしいときは、Windows SDK のコマンドプロンプトを開き直して、パス設定の順序、環境変数などを確認し、`mvn clean`できれいにしてからやり直す。
モバイルPCでのビルドには、20-30分ぐらいかかる。

ビルドが成功すると `hadoop-dist\target\hadoop-2.6.0` に hadoop 一式ができあがっているので、C:\Hadoop などとしてコピーする。再配布には、`hadoop-dist\target` に hadoop-2.6.0.tar.gz があるので、それを使う。

## 動作確認
#### まずは、ローカルモードで動作確認する。
C:\Hadoop\etc\hadoop\hadoop-env.cmd を編集し、以下の環境変数を設定する。場所は、JAVA_HOME の設定ある行あたりに続けて書いてよい。

```bat:hadoop-env.cmd
set JAVA_HOME=C:\Progra~1\Java\jdk1.7.0_71
set HADOOP_PREFIX=C:\Hadoop
set HADOOP_HOME=%HADOOP_PREFIX%
set HADOOP_CONF_DIR=%HADOOP_HOME%\etc\hadoop
```

以下の動作確認には、必要ないが、いつも使う場合には、PATH に C:\Hadoop\bin を追加しておく。これをしていないと、いきなり、疑似分散モードで使いたいときに、事前に bin\hadoop コマンドを実行しないといけなくなる。
また、本当は**管理者権限**で動作させないとエラーになる箇所（リソースマネージャがシンボリックリンクを作るときなど）があるが、以下の動作確認では、通常ユーザーでも動作する。**YARNを動作させるときは、HDFSとともに管理者権限のコマンドプロンプトから起動**すること。

通常のコマンドプロンプトを開き、以下を実行する。

```
cd C:\Hadoop
bin\hadoop jar share\hadoop\mapreduce\hadoop-mapreduce-examples-2.6.0.jar pi 5 100
```

最後に Estimated value of Pi is 3.1… のようなものがでてくれば成功。

#### 次に疑似分散モードで動作確認する。
これが動作すれば、とりあえずの Hadoopのアプリ開発や、（クラスター構築や分散に関すること以外の）勉強が十分できる。

etc\hadoop\core-site.xml に以下を追加する。

```xml:core-site.xml
<property>
  <name>fs.defaultFS</name>
  <value>hdfs://127.0.0.1:9000</value>
</property>
```

hadoop.tmp.dir を変更したいときは、少し変わったパス記述が必要になる。例えば、C:\Hadoop\data にする場合は以下のようにする。

```xml:core-site.xml
<property>
  <name>hadoop.tmp.dir</name>
  <value>/c:/hadoop/data</value>
</property>
```

etc\hadoop\hdfs-site.xml に以下を追加する。

```xml:hdfs-site.xml
<property>
  <name>dfs.replication</name>
  <value>1</value>
</property>
```

以下をコマンドプロンプトから実行する。

```
bin\hdfs namespace -format
```

デフォルトでは、C:\tmp\hadoop-%USERNAME% にHadoopのデータディレクトリが作られる。
以下のコマンドで HDFS を起動する。

```
sbin\start-dfs.cmd
```

コマンドプロンプトが２つ開いて、Namenode と Datanode が起動する。エラーがでなければ、邪魔なので最小化する。
HDFS にデフォルトのユーザーディレクトリを作成する。

```
bin\hdfs dfs -mkdir -p /user/%USERNAME%
```

これで、HDFSの準備が完了したので、grep のサンプルを使って、動作確認する。

```
bin\hdfs dfs -put C:\Hadoop\etc\hadoop input-test
bin\hdfs dfs -ls

bin\hadoop jar share\hadoop\mapreduce\hadoop-mapreduce-examples-2.6.0.jar grep input-test output-test "dfs[a-z.]+"

bin\hdfs dfs -cat output-test\part-r-*
```

うまくいけば、最後に、10行そこそこの dfsが含まれる行が表示されているはず。
なお、http://localhost:50070/ にアクセスすれば、簡単な hadoop の状況を確認できる。

Windows の場合、hdfs dfs -put のとき、ソースディレクトリは、フルパスで指定しないと失敗する。また、Linux のときは、grep のパラメータをシングルクォートしていたが、Windows ではシングルクォートがそのまま文字として渡されてしまうのでダブルクォートを使う。

HDFSを停止するには、以下のコマンドを使う。

```
sbin\stop-dfs.cmd
```

yarn の動作を確認するには、etc\hadoop\mapred-site.xml や etc\hadoop\yarn-site.xml も編集する必要がある。

```xml:mapred-site.xml
  <property>
    <name>mapreduce.framework.name</name>
    <value>yarn</value>
  </property>
```

```xml:yarn-site.xml
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
  </property>
```

YARNを起動するには、

```
sbin/start-yarn.cmd
```

動作確認は、上記の grep の例を使ってもよいし、[WindowsでHiveとSparkを動かす](http://qiita.com/qtwi/items/59e135b0a4c46e37c876) で示しているように、HiveやSparkで動作を確認することもできる。HiveやSparkまで利用すれば、実用的な運用も視野に入るだろう。

以上、お疲れさまでした。