ARM用にHadoopをビルドする。
Raspberry PiでHadoopクラスタを作ろうと試みています。
Raspberry Pi 2 Bを1個買いまして、Raspbianを入れました。Rapbianは入っているパッケージ等が実験的すぎるので、台数増えるとトラブリそうです。
Apacheから配布されているHadoop 2.6.0のバイナリを用いて、1ノードのHDFSを構築することには成功しました。
しかしながら、Hadoopにはネイティブ実装も含まれているのですが、Apacheから配布されているバイナリはx86用にビルドされております。ネイティブの部分はなくても動くのですが、ないとパフォーマンス等で不利になると思われます。
そこで、ARM用にHadoopをビルドしようと思います。ラズパイ上でビルドします。
Oracle JDK8のHard Float版が最初から入っておりましたが、これではビルドがうまく行かないのでJDK7でビルドします。本当はJDK6が良かったのですが、apt-getから取れないので7にします。
基本的にはHadoopのソースの中のBUILDING.txtの通りにやればできます。ただ、Protocol Bufferは2.5.0が必須なので自前でビルドします。
# Install require packages sudo apt-get install oracle-java7-jdk sudo apt-get install maven sudo apt-get install cmake sudo apt-get install zlib1g-dev sudo apt-get install libssl-dev sudo update-alternatives --config java # Select Oracle JDK7 # Required version of Protocol Buffer needs to be self-build. wget https://github.com/google/protobuf/releases/download/v2.5.0/protobuf-2.5.0.tar.gz tar xvzf protobuf-2.5.0.tar.gz cd protobuf-2.5.0 ./configure make sudo make install export LD_LIBRARY_PATH=/usr/local/lib echo `protobuf --version` # "libprotoc 2.5.0" -> OK cd .. # Dowload Hadoop wget ftp://ftp.riken.jp/net/apache/hadoop/common/hadoop-2.6.0/hadoop-2.6.0-src.tar.gz tar xvzf hadoop-2.6.0-src.tar.gz cd hadoop-2.6.0-src
このまま、mvn compile -Pnative
と打っても、ビルドスクリプトがバグっているっぽく失敗します。しかしながら、ARMをビルドできるようには意識して作られております。ARMはコミュニティの関心の対象にあるようです。
JNIFlags.cmake
を以下のように編集します。もっと言い直し方があるかもしれませんが、とりあえずの処置として。
--- hadoop-common-project/hadoop-common/src/JNIFlags.cmake 2015-05-06 09:02:41.374905759 +0000 +++ hadoop-common-project/hadoop-common/src/JNIFlags.cmake.bak 2015-05-06 07:26:06.229779163 +0000 @@ -41,7 +41,7 @@ message(WARNING "readelf not found; JVM float ABI detection disabled") else (READELF MATCHES "NOTFOUND") execute_process( - COMMAND ${READELF} -A $ENV{JAVA_JVM_LIBRARY} + COMMAND ${READELF} -A ${JAVA_JVM_LIBRARY} OUTPUT_VARIABLE JVM_ELF_ARCH ERROR_QUIET) if (NOT JVM_ELF_ARCH MATCHES "Tag_ABI_VFP_args: VFP registers")
これで準備が整いました。以下でHadoopをビルドします。
# Build Hadoop export JAVA_HOME=/usr/lib/jvm/jdk-7-oracle-armhf export JAVA_JVM_LIBRARY=${JAVA_HOME}/jre/lib/arm/server/libjvm.so mvn package -Pnative -Pdist -DskipTests -Dtar
時間がかかるので気長に待ちます。(100分かかりました。)
リグレッションテストもビルド時に実行できるのですが、やはり一部失敗します。 メモリが足りないとか、規定時間を超えたとかが多いのでクリティカルではなさそうなので、気にしなくてもよいのか? 本当に運用していくなら、考える必要があります。
自前ビルドのバイナリを用いて、1ノード環境でHDFSの起動とファイルの読み書きはできました。
1ノードでMapReduceやHDFSの機能をひと通り試せたら、マシンを増やしてクラスタを組みたいと思います。
バグが頻発しそうです。環境が変わるので、普通では発現しないバグが現れることが予想されます。Hadoop自体のいいテストになりそうですね。
追記 2015-05-07
[HADOOP-9320] Hadoop native build failure on ARM hard-float - ASF JIRA
CMakeでビルドエラーになる件はパッチが公開されているので、それを用いてください。
追記 2015-06-14
https://issues.apache.org/jira/browse/HADOOP-10846
このパッチもあてないと、まともに動かなさそうだ。x86以外はほとんどの人が興味ないのだと思うけど、重大な障害修正は取り込んでほしい。