ARM用にHadoopをビルドする。

f:id:fjkz:20150506234724j:plain

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ノードでMapReduceHDFSの機能をひと通り試せたら、マシンを増やしてクラスタを組みたいと思います。

バグが頻発しそうです。環境が変わるので、普通では発現しないバグが現れることが予想されます。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以外はほとんどの人が興味ないのだと思うけど、重大な障害修正は取り込んでほしい。