RaspberryPi で ApacheSparkを動かす

# はじめに
## 前提
RaspberryPi3を使用しています。
RaspberryPiがネットに繋がる状態であることとします。（固定IPで）
RaspberryPi3のOSはRaspbianを使用しています。
固定IPでRaspberryPi3に無線LAN設定までは記事にしていますので以下をご覧ください。
[RaspberryPi3のOS（Raspbian）インストールから無線LAN設定まで](http://qiita.com/tMatSuZ/items/20760381a038f1cefd6c)
## クラスター構成
RasberryPiを４台用意したので、１台をmaster、その他３台をslaveとしました。

# RasberryPiにSparkを入れる
この設定は各RasberryPiで行う必要があります。
RasberryPiのユーザーは標準のpiを使用しました。その他のユーザーを使用したい場合は各RasberryPiでユーザー作成を行い、スイッチしてから作業してください。

## RasberryPiにJava8のインストール
すでにjavaが入っている場合は飛ばしてください。

```
$ apt-cache search oracle jdk
$ sudo apt-get update
$ sudo apt-get install oracle-java8-jdk
```

## /etc/hostnameの設定
各RasberryPiをIPでなくhost名で管理するために設定します。
自分でわかりやすい名前をつけてください。

```
$ sudo vi /etc/hostname
```

## /etc/hostsの設定
各RasberryPiに通信する際楽になるので設定します。
/etc/hostnameの設定でつけたhostnameとそのRasberryPiのIPを全マシン分記載してください。

```
$ sudo vi /etc/hosts
```

例として参考までに載せておきます。

```shell-session:/etc/hosts
##### ↓のlocalhostやipv6はコメントアウトしています。
#127.0.0.1      localhost
#::1            localhost ip6-localhost ip6-loopback
#ff02::1                ip6-allnodes
#ff02::2                ip6-allrouters
#127.0.1.1      raspberrypi

##### ↓が各RasberryPiのホスト名（今回追記分）
192.168.11.１0 green01
192.168.11.11 blue01
192.168.11.12 pink01
192.168.11.13 clear01
```

## RasberryPiを再起動する
```
$ sudo reboot
```

## masterからslaveへSSHする際PWを求められないように、鍵を配置する
この作業はmasterのRasberryPiのみで大丈夫です。

```
$ ssh-keygen
$ ssh-copy-id pi@green01
$ ssh-copy-id pi@blue01
$ ssh-copy-id pi@pink01
$ ssh-copy-id pi@clear01
```

## Sparkをダウンロードする
2016/11/28時点で最新だったものをダウンロードしています。
version 2.0.2

```
$ wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.2-bin-hadoop2.7.tgz
$ tar xzvf spark-2.0.2-bin-hadoop2.7.tgz
```

# Sparkの設定
修正対象は以下の２ファイルです。

- conf/slaves
- conf/spark-env.sh

conf/slavesはmasterだけ設定しておけばいいのですが、conf/spark-env.shについてはslaveにも同様のファイルを配置する必要があります。
例としてgreen01というhostnameのRaspberryPiをmasterとします。

## conf/slavesの設定
```
$ cd spark-2.0.2-bin-hadoop2.7/
$ cp conf/slaves.template conf/slaves
$ vi conf/slaves
```

conf/slavesの末尾にslaveのhostnameを追記してください。
例として参考までに載せておきます。

```shell-session:conf/slaves
blue01
pink01
clear01
```


## conf/spark-env.shの設定
```
$ cd spark-2.0.2-bin-hadoop2.7/
$ cp conf/spark-env.sh.template conf/spark-env.sh
$ vi conf/spark-env.sh
```

conf/spark-env.shの末尾に追記してください。
例として参考までに載せておきます。
パラメータ値は自由に設定してください。

```shell-session:conf/spark-env.sh
SPARK_MASTER_IP=green01
SPARK_EXECUTOR_MEMORY=512m
SPARK_DRIVER_MEMORY=512m
SPARK_EXECUTOR_INSTANCES=3
```

※このconf/spark-env.shはslaveの同パスに配置する必要があります。

# Sparkを動かす
ようやくここまできました。
ここの作業はmasterで行ってください。

## SparkClusterの起動
```
$ cd spark-2.0.2-bin-hadoop2.7/
$ ./sbin/start-all.sh
```
起動しているかWebにアクセスして確認してみてください。
"http://(masterのIPアドレス):8080"
うまく行っていれば「Workers」にslave達が羅列されていると思います。
もしされていなければもう一度設定を見なおしてみてください。

## Sparkを実行する
以下のコマンドで「--master spark://(masterのIPアドレス):7077」は各自置き換えてください。

```
$ bin/spark-submit --class org.apache.spark.examples.GroupByTest --master spark://(masterのIPアドレス):7077 examples/jars/spark-examples_2.11-2.0.2.jar 30
```

## SparkClusterの停止
```
$ cd spark-2.0.2-bin-hadoop2.7/
$ ./sbin/stop-all.sh
```

# 参考
[Raspberry Pi 2 2台でApache Sparkの並列分散処理を試す](http://make-muda.weblike.jp/2015/05/2801/#more-2801)

# おわりに
永かった・・・
無事RaspberryPi達を労働者にすることができました。
次はCassandra入れてみようと思います。