Windows上でHadoop 2.4.1をビルドする

Windows上でHadoopを実行する方法はいくつかあるのですが、色々興味本位に試していたら、うっかりWindows上でHaoopをビルドしてしまったので、その備忘録です。

何故ビルドしてしまったかというと、Windows上で実行するのに必要なバイナリ（EXE）がtarball に同梱されていなかったためです。たとえば、Windows上でHadoopが必要とするUNIX系コマンドは、winutils.exe という名前のユーティリティ経由で実行されるのですが、これがなかったためで半ばビルドすること自体が目的になった感じです。

以前は、そのためCygwinが必須でしたが、現在のHadoop 2.2以降では、CygwinなしでHadoopが実行出来るようになってます（ただしビルド時に、chmod/rm などのgnuwin32系のコマンドが必要だったりします）。また、Hadoop 1.1系もWindowsで動く（HDInsight Emulatorとか）で、そちらもきちんとビルドできると思われます。

元となる情報は、

* https://wiki.apache.org/hadoop/Hadoop2OnWindows
* https://svn.apache.org/viewvc/hadoop/common/branches/branch-2/BUILDING.txt?view=markup

を参照すれば無問題かと思います。


## ビルド環境
初めにザックリと、必要な環境を列挙しますが、具体的にどうしたかは順次述べます。

 * Windows System
 * JDK 1.6+
 * Maven 3.0 or later
 * Findbugs 1.3.9 (if running findbugs)
 * ProtocolBuffer 2.5.0
 * Windows SDK or Visual Studio 2010 Professional
 * Unix command-line tools from GnuWin32 or Cygwin: sh, mkdir, rm, cp, tar, gzip
 * zlib headers (if building native code bindings for zlib)
 * Internet connection for first build (to fetch all Maven and Hadoop dependencies)
 
findbugsは、実行してないので入れませんでした。

## OS
ビルド環境として、以下のOSがサポートされてます。

 * Windows Server 2008 / 2008 R2
 * Windows Vista / 7

推奨はServer系です。最新のWindows 8 / Server 2012 / 2012R2系は Windows SDKのバージョンからかムリみたいな感じです。冒険するのも時間の無駄なので、さくっとAzureの仮想マシンに2008 R2 を起動して環境を作るのが楽かと思います。

今回は、<b>Azure上のWindows 2008 R2 64bit 英語版 の仮想マシン</b>で試しました。

#### Windows SDK
Windows バイナリのビルドには、Windows SDKもしくは、Visual Studioが必要です。ただし、Visual Studioの場合、2010 のみサポート、Expressはサポート外ですので注意しましょう。今回は、Windows SDK 7.1 を入れました。Windows SDKは以下からダウンロードして、インストールします。

* http://www.microsoft.com/en-us/download/details.aspx?id=8279

## JDK

JDK8ではなく、JDK7 64bit版の最新を入れました。（この時点で、jdk1.7.0_65）以下からダウンロードして普通にインストールします。

* http://www.oracle.com/technetwork/jp/java/javase/downloads/jdk7-downloads-1880260.html

<b>JAVA_HOME </b>環境変数の設定を忘れずに。

## Maven
Maven をインストールします。最新は、3.3系ですが、これで試してみたらビルドに失敗したので、3.0系の最新である、3.0.5 をインストールしました。

* http://maven.apache.org/download.cgi

インストール方法は、以下のブログに解説しててあるので、問題ないでしょう。

* http://oscasierra.net/2012/07/install-maven-3-0/

mvnコマンドが実行できるように、PATHを通しておいてください。

![Image-2014-07-28-172527-001.png](https://qiita-image-store.s3.amazonaws.com/0/50166/1bc5121b-0b31-5d8f-a275-c1933164e584.png)


## Unix コマンド系
実行には、Cygwin等いらないのですが、ビルドには何故かUnixコマンド的な何かが必要です。Cygwin or GnuWin32 とのことでしたで、~~ここではGnuWin32ベースのものをインストールしました。~~ 結局後々、sh.exeが必要だったり、cygdrive に依存していたりする部分があったので、cygwin64 を入れました。

* ~~http://gnuwin32.sourceforge.net/~~

~~上記から、以下の3つをインストールすればOKでした。~~

* ~~CoreUtil ( ファイル操作系のコマンド一式が入っている）~~
* ~~gzip~~
* ~~tar~~

なので、上記はヤメで、以下からcygwin64をインストールして、PATHの最後の方に追加します。cygwinのterminalからビルドはできません。

* https://www.cygwin.com/ 

## ZLIB
Zlibのバイナリとインクルードヘッダが必要です。テストされたバージョンは、1.2.7で、配布されている最新は1.2.8です。念のため1.2.7 と指定されたバージョンにしました。以下から、zlib-1.2.7-dll.zip をダウンロードして展開しましょう。

* http://sourceforge.net/projects/libpng/files/zlib/1.2.7/

例えば、c:\zlib-1.2.7 に展開したとすると、そこを<b>PATH</b>に通しておきます。また<b>ZLIB_HOME</b>環境変数に、展開したパスを設定しておきます。


あと、コンパイルにZlibのインクルード（*.h)が必要となります。Makefileとか修正するのとか面倒くさいので、


> C:\Program Files\Microsoft SDKs\Windows\v7.1\Include

に、zlib.h  /  zconf.h を コピーしておけば大丈夫です。

## ProtocolBuffer 
Googleの提供しているProtocolBuffer2.5が必要となる。以下からダウンロード可能となるので、適宜展開しPATHにprotoc.exe が起動できるようにしておく。

* https://code.google.com/p/protobuf/

これでツール類の事前準備は完了。

## Platform環境変数
Platform環境変数に、x64 or Win32 のどちらかを定義します。x64 でビルドしているので、x64 を設定します。

> set Platform = x64

このとき、"Platform" の文字列は、ケースセンシティブですと、BUILD.txtに書かれているので、注意してください。

> Environment variables on Windows are usually case-insensitive, but Maven treats
220	them as case-sensitive.

## Hadoop ソースの展開
Hadoopは、ApacheのWebページから2.4.1をダウンロードして展開します。Windowsだとパス長の問題があるので、比較的浅い位置（c:\hdc)とかに展開してください。

* http://www.apache.org/dyn/closer.cgi/hadoop/common/


## ビルド
Windows コマンドプロンプトではなく、Windows SDKのコマンドプロンプトを開きます。多分文字が黄色です。そこで、以下のように入力すれば、とりあえずビルド完了するでしょう。

```
mvn compile -Pnative-win
```

エラーが出たら、メッセージの指示にしたがって、-e パラメータを付けたりしてデバッグしながら、やればうまく行くはずです。私も何回か、Try & Errorでした。

で、以下ビルドした結果画像です。

![Image-2014-07-25-175945-001.png](https://qiita-image-store.s3.amazonaws.com/0/50166/d0139b75-6637-acd0-2a9a-7de4f7fd4dfd.png)


~~これ以降はまた別の機会に。~~

で、最終的にバイナリ入りのtarballを作るには、

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

を実行する必要があります。ビルドには、ちょっと時間がかかりますが、成功すると、

> hadoop-dist\target\hadoop-2.4.1.tar.gz

が出来るはずです。Windows向けのバイナリも同梱されているでしょう。