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より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:\ 直下か1つ下にソースを展開する。
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 の設定ある行あたりに続けて書いてよい。
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 に以下を追加する。
<property>
<name>fs.defaultFS</name>
<value>hdfs://127.0.0.1:9000</value>
</property>
hadoop.tmp.dir を変更したいときは、少し変わったパス記述が必要になる。例えば、C:\Hadoop\data にする場合は以下のようにする。
<property>
<name>hadoop.tmp.dir</name>
<value>/c:/hadoop/data</value>
</property>
etc\hadoop\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
コマンドプロンプトが2つ開いて、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 も編集する必要がある。
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
YARNを起動するには、
sbin/start-yarn.cmd
動作確認は、上記の grep の例を使ってもよいし、WindowsでHiveとSparkを動かす で示しているように、HiveやSparkで動作を確認することもできる。HiveやSparkまで利用すれば、実用的な運用も視野に入るだろう。
以上、お疲れさまでした。