Raspberry Pi 2 2台でApache Sparkの並列分散処理を試す

spark-ui-2-cut

前回まででRaspberry Pi 2単独でのApache Sparkの動作確認は完了したので、次はいよいよ2台のRaspberry Piを使った並列分散処理を試したいと思います。引き続き、以下のページを参考にさせていただきます。

ここでは”standalone”と言われるクラスタモードで動作確認をします。クラスタモードについては、ここに記述があります。

“standalone”というのクラスタマネージャの一つで、Sparkにパッケージングされている、シンプルなクラスタマネージャのようです。クラスタマネージャは、リソースの割り当てを行うもの。クラスタマネージャとしては、他に”Apache Mesos”, “Hadoop YARN”, “Amazon EC2″が使えるようです。ゆくゆくはこれらの上でちゃんとSparkを使えるようにしたいですが、とりあえずは”standalone”で。

まずはどちらのノード(Raspberry Pi)をMasterにするかを決めて、そのノードがパスワード入力なしで他のノードにSSHでアクセスできるように設定します。Master側のRaspberry Piで、以下を実行します。

$ ssh-keygen

このときパスフレーズを入力してしまうと、パスワード入力はなくなってもパスフレーズ入力は要求されてしまうので、パスフレーズ入力は空のままEnterでOKです。これで、/home/spark/.sshの下に、以下が生成されます。

  • id_rsa(秘密鍵)
  • id_rsa.pub(公開鍵)

続いて、公開鍵の方を、Worker(その他)側のRaspberry Piにコピーします。

$ ssh-copy-id spark@192.168.xxx.xxx

これを実行すると、Worker側のRaspberry Piに”/home/spark/.ssh/authorized_keys”が生成され、その中にMaster側の公開鍵の内容が記述されます。

また、今回はMasterもWorkerとして動作させるつもりなので、localhostにもパスワードなしでSSH接続できるよう、以下も忘れずに実行します。

$ ssh-copy-id localhost

これで、Master側からWorker側へパスワードなしでSSHログインができるようになったはずです。一度、Master側からWorker側にSSHログインをして確認してみてください。

次に、Master側のRaspberry Piで、Workerとして動作するRaspberry Piを設定します。confフォルダの下にslaves.templateファイルがあるので、これを同じフォルダに名前”slaves”でコピーして、以下のように記述します。

# A Spark Worker will be started on each of the machines listed below.
localhost
192.168.xxx.xxx

一つ目は自分自身、もう一つがWorker側のRaspberry Piのアドレスです。今回はRaspberry Piを2台しか用意できていないので、Masterには自分自身にもWorkerとしてタスクを割り振るようにしています。

続いて、同じくconfフォルダの下にspark-env.sh.templateファイルがあるので、これを同じフォルダに名前”spark-env.sh”でコピーして、以下の2つを設定します。

  • SPARK_MASTER_IP=192.168.24.51
  • SPARK_WORKER_MEMORY=512m

メモリはRaspberry Pi 2に合わせて少なめに設定しています。あとは、この”spark-env.sh”を、Worker側の同フォルダにコピーします。

$ scp spark-env.sh spark@192.168.xxx.xxx:spark-1.3.1-bin-hadoop2.6/conf/.

これで準備はOK。Master側で、以下を実行します。

$ sbin/start-all.sh
starting org.apache.spark.deploy.master.Master, logging to /home/spark/spark-1.3.1-bin-hadoop2.6/sbin/../logs/spark-spark-org.apache.spark.deploy.master.Master-1-raspiA.out
192.168.xxx.xxx: starting org.apache.spark.deploy.worker.Worker, logging to /home/spark/spark-1.3.1-bin-hadoop2.6/sbin/../logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-raspiB.out
localhost: starting org.apache.spark.deploy.worker.Worker, logging to /home/spark/spark-1.3.1-bin-hadoop2.6/sbin/../logs/spark-spark-org.apache.spark.deploy.worker.Worker-1-raspiA.out

こんな感じのメッセージが出てきたら、Master側のSpark UIにアクセスしてみましょう。上記のコマンドを実行してから少しすると、ブラウザで”http://192.168.xxx.xxx:8080″にアクセスできるハズです。

sparkui-cut

これで、2つのWorkerが立ち上がっていることが確認できます。1つしか立ち上がっていない場合は、どこかで設定が間違っていると思うので、一度設定を見直してみてください。自分は”/etc/slaves”のファイル名が”/etc/slave”になっていました。。。

では、この状態でSparkシェルを立ち上げてみます。MasterのURLはSparkUIのWebページのトップに表示されているので、それをmasterオプションの引数に指定します。

$ bin/spark-shell --master spark://192.168.24.51:7077

起動にはちょっと時間がかかります。起動が完了したら、SparkUIのページをリロードしてみましょう。”Running Applications”に”Spark shell”が追加されていることが確認できます。

spark-ui-2-cut

この状態で、以下を実行してみます。

scala> sc.textFile("README.md").count

特に問題がなければ、”res0: Long = 98″が返ってくるはずです。Sparkシェルなしでも実行してみましょう。Ctrl + CでSparkシェルを終了してから、

$ bin/spark-submit --class org.apache.spark.examples.SparkPi --master spark://192.168.24.51:7077 lib/spark-examples-1.3.1-hadoop2.6.0.jar 10

動き始めると、2台のRaspberry Piの動確用のLEDが点滅するようになります。ちょっと感動。

th_raspi-spark

確認が終わったら、Master側でSparkを終了させます。

$ sbin/stop-all.sh

終了すると、SparkUIにもアクセスできなくなります。

 

今後はもう1, 2台ほどRaspberry Piを増やして、HDFSの環境まで整えた上でチャレンジしたいところですが、Raspberry Pi 2を使ったApache Sparkの並列分散処理テストは一旦おしまいにします。おつかれさまでした。

実はApache Storm編もあるのですが、こんな話題ばかりなのも疲れるので、次回はいつものラピロ工作話の予定です。