SparkをインストールしてMesosクラスタと疎通確認するまでの手順


## 概要

SparkをインストールしてMesosクラスタとの疎通を確認します。
結構はまるので、メモとして残しておきます。

**Mesosクラスタは以前に書いた以下の記事のものを使っていますので参考にしてください**。

[Mesosを簡単にインストールする]
https://qiita.com/48hands/items/5d17372b81b1923b16a7


* Mesos 1.5.0クラスタ
    * node1: Mesosマスタ
    * node2,node3,node4: Meosスレーブ
* Spark 2.3.0
    * node1~node4のMesosクラスタを構成するすべてのマシンにインストールします。

※各マシンのOSはCentOS7になっています。**また、各マシンのメモリは2GB以上欲しいです。あまりメモリが少ないとSparkが実行できません**。

## 事前準備

### Javaのインストール

SparkはJVM上で動作するのでJavaをMesosクラスタを構成するすべてのマシン(`node1`,`node2`,`node3`,`node4`)にJavaをインストールしておいてください。

```
sudo yum install -y java-1.8.0-openjdk
```

## Sparkのインストール


### Spark2.3.0のダウンロード

Sparkのインストールも**Mesosクラスタを構築するすべてのマシン**で実施してください。

```
cd ~
curl -O http://ftp.jaist.ac.jp/pub/apache/spark/spark-2.3.0/spark-2.3.0-bin-hadoop2.7.tgz
sudo tar xvfz spark-2.3.0-bin-hadoop2.7.tgz -C /opt/
```

### spark-env.shの設定　

この設定も**Mesosクラスタを構築するすべてのマシン**で実施してください。


`/opt/spark-2.3.0-bin-hadoop2.7/conf/spark-env.sh`を各マシンで以下のように設定してください。

```/opt/spark-2.3.0-bin-hadoop2.7/conf/spark-env.sh
MESOS_NATIVE_JAVA_LIBRARY=/usr/lib/libmesos.so
SPARK_LOCAL_IP=各自のIPアドレス
LIBPROCESS_IP=各自のIPアドレス

# 以下の2行は十分なメモリリソースがあれば不要
# 今回はメモリリソースが2GBぐらいしかないので仕方なく設定しています。
SPARK_DRIVER_MEMORY=512M
SPARK_DAEMON_MEMORY=256M
```

### SPARK_HOMEの設定

この設定はMesosマスタ（筆者の環境だと`node1`）だけで大丈夫です。
Sparkを実行するユーザの環境変数として設定してください。

```
echo 'export SPARK_HOME=/opt/spark-2.3.0-bin-hadoop2.7' >> ~/.bash_profile
source ~/.bash_profile
```

この設定によって、Sparkの分散実行先(Mesosスレーブ側)で`SPARK_HOME`が環境変数として設定されていなくても、`/opt/spark-2.3.0-bin-hadoop2.7`をデフォルトで参照してくれるっぽいです。

## spark-shellからMesos上で分散処理できるか確認

`spark-shell`をMesos上で動かして確認する。

パラメータですが、ざっくり説明すると、

`executor-memory`はMesos Slave側でSparkの分散処理実行用に割り当てるメモリ（当然Mesosのリソースを超えるのはNG）。
`total-executor-cores`はSparkのタスクを処理するのに必要なクラスタ全体のコア数を表しています。


```
$SPARK_HOME/bin/spark-shell \ 
--master mesos://MesosマスタのIP:5050 \ 
--executor-memory 512M \ 
--total-executor-cores 3

...
spark context Web UI available at http://192.168.33.41:4040
Spark context available as 'sc' (master = mesos://192.168.33.41:5050, app id = 54c5ee8e-cd99-408a-b815-2c62c9f3fbb0-0011).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.3.0
      /_/

Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_171)
Type in expressions to have them evaluated.
Type :help for more information.

scala> sc.parallelize(1 to 10000,30).sum
res1: Double = 5.0005E7
```

計算できていればOK!
`sc.parallelize(1 to 10000,30).sum`の部分は1から10000までの自然数の総和を計算する処理を30分割で分散実行するといった意味になります。

UIも以下のようになっていればOK！

[Mesos UI]
http://MesosマスタのIP:5050

<img width="1191" alt="spark-mesos.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/5b846b1c-f8c4-0a2e-2ce8-919a0de0d1bf.png">



[Spark WebUI]
http://MesosマスタのIP:4040

<img width="1186" alt="spark-ui.png" src="https://qiita-image-store.s3.amazonaws.com/0/203061/d45fa5e8-e1b3-2448-2219-aa98dca599de.png">


## サンプルJARアプリの実行

付属のJARサンプルアプリで円周率計算を実行できるかも念のため確認しておきます。ログがどっと出力されますが、途中でそれっぽい値が確認できるはずです。

```
$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master mesos://MesosマスタのIP:5050 \
--executor-memory 512M
--deploy-mode client \
$SPARK_HOME/examples/jars/spark-examples_2.11-2.3.0.jar \
1000


...

Pi is roughly 3.1417888714178885
...
```

以上、SparkをインストールしてMesosクラスタで簡単に動作させて確認するまでの手順でした。