Scala + Apache Spark をIntelliJにて開発する方法

- Scala + Spark でScalable なプロジェクトを開発したいことがあるかと思います。
- ここでは，Spark のExample に示されているコードを，IntelliJ 上でどのように開発するかをスクリーンショットとともに紹介します。
    - 参考
        - http://spark.apache.org/docs/latest/quick-start.html 


# Apache Spark の準備
## Spark のソースコードをダウンロードしてくる
- `git clone git://github.com/apache/spark.git -b branch-1.6`
    - これで，Spark の1.6 の安定版がダウンロードされる

## Spark をビルドする
### maven をインストール
    - 例えば，http://qiita.com/chosan211/items/1472198165442e93047e などを参照してインストールする
    - 手元のmac環境の場合は，macports を使って下記のように簡単にインストールできた
        - `$sudo port install maven3`
        - `$sudo port select --set maven maven3`
        - `$ mvn --version`

```
yk-tanigawa$ sudo port install maven3
--->  Computing dependencies for maven3
--->  Dependencies to be installed: maven_select
--->  Fetching archive for maven_select
--->  Attempting to fetch maven_select-0.3_1.darwin_14.noarch.tbz2 from https://packages.macports.org/maven_select
--->  Attempting to fetch maven_select-0.3_1.darwin_14.noarch.tbz2.rmd160 from https://packages.macports.org/maven_select
--->  Installing maven_select @0.3_1
--->  Activating maven_select @0.3_1
--->  Cleaning maven_select
--->  Fetching archive for maven3
--->  Attempting to fetch maven3-3.3.9_0.darwin_14.noarch.tbz2 from https://packages.macports.org/maven3
--->  Attempting to fetch maven3-3.3.9_0.darwin_14.noarch.tbz2.rmd160 from https://packages.macports.org/maven3
--->  Installing maven3 @3.3.9_0
--->  Activating maven3 @3.3.9_0

To make maven 3.3.9 the default, please run
	sudo port select --set maven maven3

--->  Cleaning maven3
--->  Updating database of binaries
--->  Scanning binaries for linking errors
--->  No broken files found.                         

yk-tanigawa$ sudo port select --set maven maven3
Selecting 'maven3' for 'maven' succeeded. 'maven3' is now active.

yk-tanigawa$ mvn --version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /opt/local/share/java/maven3
Java version: 1.8.0_91, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.5", arch: "x86_64", family: "mac"
```

### Spark をビルドする
- `$ cd spark`
- `$ build/mvn -Pyarn -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests clean package`
- しばらく時間がかかります。

# IntelliJ のセットアップ
## ダウンロード & インストール
- 他のページを見てください
- scala, sbt plugin を入れ忘れないように

# IntelliJ で新しいプロジェクトを作成
- sbt ベースのプロジェクトを作ります
![Screenshot 2016-05-06 12.42.53.png](https://qiita-image-store.s3.amazonaws.com/0/109769/86a82271-cd2e-eb17-821c-d82937073834.png)

- Use auto-import を入れておくと便利です
![Screenshot 2016-05-06 12.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/109769/7d37e9b0-3ba3-1703-d267-b9ddd9c62397.png)

- project/src/main/scala にscala class を作ります。
![Screenshot 2016-05-06 12.45.24.png](https://qiita-image-store.s3.amazonaws.com/0/109769/a9064763-d578-5974-9079-33390207f08a.png)

- Class の名前は http://spark.apache.org/docs/latest/quick-start.html での例に習って，SimpleApp にします
![Screenshot 2016-05-06 12.51.26.png](https://qiita-image-store.s3.amazonaws.com/0/109769/4e855a88-c16f-3013-c54f-00fe809912da.png)

- Simple App のソースコードを書きます
![Screenshot 2016-05-06 14.13.28.png](https://qiita-image-store.s3.amazonaws.com/0/109769/e687d55d-100b-b2fd-603e-ff615e5b05d4.png)

- `build.sbt` に，sparkのLibrary を使うということを追記します
![Screenshot 2016-05-06 14.11.48.png](https://qiita-image-store.s3.amazonaws.com/0/109769/70e82542-abc4-680b-7c73-1b9853273335.png)


# jar ファイルにまとめる

- IntelliJ のconsole で`sbt package` コマンドを実行，ソースコードをjar ファイルにまとめます


```
yk-tanigawa$ sbt package
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=384m; support was removed in 8.0
[info] Loading project definition from /Users/yk-tanigawa/IdeaProjects/scala-spark-example01/project
[info] Set current project to scala-spark-example01 (in build file:/Users/yk-tanigawa/IdeaProjects/scala-spark-example01/)
[info] Updating {file:/Users/yk-tanigawa/IdeaProjects/scala-spark-example01/}scala-spark-example01...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] Compiling 1 Scala source to /Users/yk-tanigawa/IdeaProjects/scala-spark-example01/target/scala-2.11/classes...
[info] Packaging /Users/yk-tanigawa/IdeaProjects/scala-spark-example01/target/scala-2.11/scala-spark-example01_2.11-1.0.jar ...
[info] Done packaging.
[success] Total time: 27 s, completed May 6, 2016 2:20:21 PM
```

# spark–submit を使ってプログラムを実行します
- 先ほどSpark をインストールしたディレクトリをターミナルで開き，spark-submit コマンドで，先ほど作ったjar ファイルを投げます
- `$ ./bin/spark-submit --class "SimpleApp" --master local[2] ~/IdeaProjects/scala-spark-example01/target/scala-2.11/scala-spark-example01_2.11-1.0.jar `

- 無事に実行されました
    - `Lines with a: 58, Lines with b: 26`