Rasberry PiでHadoopクラスターを構築する。その2
したこと:
- 配線を綺麗にした
前回と比較してほしい。かなり美しくなっている
- スイッチングハブをBuffalo製のに変えた。
初期不良を掴んでしまったみたいなので、新しく買った。2000円なので交換する手間のほうが高いので。
Raspiが100Mpbsしか無理なので、全く意味はないけれど、1Gbpm対応のにした。今後マシンがバージョンアップしたら買い換えることももしかしたらあるかもしれないので。
- ネームノードのMicroSDカードがお亡くなりになった。
スレーブノードの5個はSumsung製だったのだが、マスターだけTransend製であった。これも初期不良を掴んでしまったようだ。OSが起動しなくなった。ルートFSが壊れている。一度同様の現象があって、入れなおしたのだが、また起こった。今後も同様のことが起こると思われるのですべてSumsung製にする。たった1000円だし。
毎日のようにAmazonに注文をしている。
安定稼働まで道のりは険しそうだ。できるのか?
Rasberry PiでHadoopクラスターを構築する。その1
Raspberry PiでHadoopクラスタを作ろうと思いまして、ゴニョゴニョしております。
写真のようにハードウェアは組み上がりました。
構成としては、
部品 | メーカー | 個数 |
---|---|---|
Raspberry Pi 2 B | 6 | |
USB HDD 1TB | Trancend | 5 |
Micro SD Class 10 | Sumsung | 6 |
100 Mbps 8ポート スイッチングハブ | Logitec | 1 |
LANケーブル内部用50cm | 6 | |
LANケーブル外部接続用 | 2 | |
USB電源 50W 6ポート | Sanwa | 1 |
電源用 Micro USBケーブル | ダイソー | 6 |
ラック | ダイソー | 1 |
です。
HDDの電源はラズパイのUSBから採っている。
OSは以下の方法を参考に入れたスペシャル版Ubuntu 14.04 Server。
第362回 Raspberry Pi 2でXubuntu 14.04を動かす:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社
HadoopはApache版2.6.0をARM用に自前ビルドしたものである。
マスター1台、スレーブ5台の構成です。冗長化とかは特にせず。*1
しかしながら、メモリががノードあたり1GBしかないので、YARNでMapReduceプログラムを動かそうとしても、リソースの取得で失敗します。ちょっとチューニングが必要そうです。
しかし、チューニングを始めようとしたら、かったばかりのハブが壊れてしましました。ハブを直してから、YARNについて検証します。
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以外はほとんどの人が興味ないのだと思うけど、重大な障害修正は取り込んでほしい。
マンデルブロ集合を計算してみる4
第1回:マンデルブロ集合を計算してみる - 超ウィザード級ハッカーのたのしみ
第2回:マンデルブロ集合を計算してみる2 - 超ウィザード級ハッカーのたのしみ
第3回:マンデルブロ集合を計算してみる3 - 超ウィザード級ハッカーのたのしみ
マンデルブロ集合に含まれるcに対して、以下の漸化式がどういう振る舞いをするかが気になっています。
cが実数の場合は、ただのロジスティック写像なので既にアホみたいに調べられています。以下は分岐図と呼ばれるものです。プロットがあるところに値が収束します。値が複数あるときは、複数の値を繰り返す動きに収束します。
マンデルブロ集合の絵と比較すると面白いことがわかります。
右から順に。
分岐図が1本のところは絵のアの領域に相当します。ここでは1つの値にzが収束していきます。おそらく、このハート型の上の点ではzが周期1の固定点に収束するでしょう。
分岐図が2本のところは絵のイの領域です。この島は周期2で2つの値が交互に現れるようにzが収束していくものと思われれます。z=0となるc=-1もこの島に含まれています。
さらに左にいって、分岐が4本になったところにはウの領域です。この島ではzは周期4で値を繰り返すようになるようです。
エの小さい島では、分岐が8本になります。
エ・オ・カ・キの島の間、あるいは先の棒では値が一定しない、いわゆるカオスとなります。
オ・カ・キの島のがあるところでは、分岐図の値が分散していません。バンドと呼ばれる領域です。
どうやら、マンデルブロ集合の島は、zの振る舞いと関連しているらしいです。
マンデルブロ集合を計算してみる3
前々回:マンデルブロ集合を計算してみる - 超ウィザード級ハッカーのたのしみ
前回:マンデルブロ集合を計算してみる2 - 超ウィザード級ハッカーのたのしみ
マンデルブロ集合は以下示される複素数列の挙動について表したものである。
そこで、この複素数列z_nの動きを絵にしてみました。画像の各点が複素数cのときのz_nを表しています。横軸がcの実部を変えたとき、縦軸がcの虚部を変えたときを示しています。複素数z_nの偏角を色相で表し、絶対値を明度で表します。絶対値が大きいと明度が小さくなる、つまり黒色になります。
n=1
色相が不連続な点はz_1=0の点を示しています。c=(0,0)(複素数a+biを(a,b)と表します)の点でz_1=0となります。
z_1=0というのはz_nが初期値z_0=0に戻ったことを意味しています。c=(0,0)の点では、周期1の繰り返し、つまり全てのnでz_nは同じ値となります。
n=2
c=(0,0)の点で、z_2=0です。以下のどのnの絵でもc=(0,0)の点では色相が不連続です。
別の色相が不連続な点があります。c=(-1,0)の点です。この点は2ステップでz_nが初期値に戻る、つまり周期2でz_nの値が繰り返します。
n=3
周期1と周期3で繰り返す点で色相が不連続になっています。周期3の点が3つあることがわかります。n=3までのz_n=0となる点は手で計算可能です。
n=4
周期が1,2,4で繰り返す点で色相が不連続になっています。z_nが発散してきた点は黒で表示されています。
n=11
以降同様になりますが、適当に3例だけ貼っておきます。
n=47
素数の場合はz_n=0の点は少なくなります。
n=720
逆にn=6!=720のように約数の多い数はz_n=0の点も多くなります。
考え事
マンデルブロ集合の定義から、マンデルブロ集合には、全ての自然数の周期でz_nが繰り返す点が含まれています。この点の集合をAとします。*1
マンデルブロ集合と集合Aは一致するのでしょうか?おそらく一致しないと予想します。
その場合に、マンデルブロ集合に含まれて、集合Aに含まれない点はどういう動きをするのでしょうか?*2ある値の近傍をぐるぐる回るような動きをするような気がします。もしかしたら、どこかの値に漸近していくやつもいるかもしれません。
また、マンデルブロ集合と集合Aは濃度的な意味でどちらが多いのでしょうか?*3
マンデルブロ集合のフチの集合は、全て集合Aに含まれないのか、全て集合Aに含まれるのか?一部だけ含まれるというのはなさそうです。*4少なくとも、マンデルブロ集合の中の集合に、集合Aの一部は含まれているようです。