[メモ]Sparkのローカル開発環境を作った

## 背景
Sparkでデータの重複を除外したいので、sparkの開発環境をローカルで作ってみた。

macOS 10.14.2

## 必要な物
- JDK
- Scala
- Spark
- IntelliJ
  - sbt

## Sparkの開発環境作成
### JDK
もともと`jdk1.8.0_11`がインストール済みですが、そのバージョンだとうまく行かなかったので、手動で最新のJDKに更新した。

ちなみに、macOSにはデフォルトJREをインストールされてますが、JDKがないです。

「システム設定」-> 「Java」で更新してもJREしか更新されないです。

- 古いJDKを消す

```shell

sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk
```

- 最新のJDKをインストール
    - [Java SE Development Kit 8 \- Downloads](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
    - Download and install
- 環境変数を設定
    
```shell:~/.bash_profile
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/"
export PATH=$JAVA_HOME/bin:$PATH
```

### Scala
- Scalaをインストール

```shell
brew install scala
brew install scala@2.11
```

Intellijだけを使うなら、ここでscalaをインストールしなくてもよいですが、インストールしておいても損はないでしょう。

自分はscala 2.11も使いたいので、別でscala2.11もインストールした。

- 環境変数設定

```shell:~/.bash_profile
export SCALA_HOME="/usr/local/Cellar/scala@2.11/2.11.12/"
export PATH=$SCALA_HOME/bin:$PATH
```

### Spark
- sparkをインストール

```shell
$ brew search spark
==> Formulae
apache-spark ✔                                                                  spark                                                                           sparkey

==> Casks
homebrew/cask/spark
```

`apache-spark`と`spark`ともありますが、`spark`は全然別のものです。`apache-spark`をインストールしましょう。

```shell
brew install apache-spark

$ spark-shell
2019-02-08 09:42:20 WARN  NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
2019-02-08 09:42:32 WARN  Utils:66 - Service 'SparkUI' could not bind on port 4040. Attempting port 4041.
Spark context Web UI available at http://172.16.193.147:4041
Spark context available as 'sc' (master = local[*], app id = local-1549586552672).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.0
      /_/

Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_201)
Type in expressions to have them evaluated.
Type :help for more information.

scala> :quit
```

### Intellij
- Intellijをインストール
- `plugin scala`をインストール
- `plugin sbt`をインストール

### 設定
- SDKを設定する

最新のJDKを指定しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37718/e3186d8d-638f-b21b-49be-dbe65657b7e7.png)

- buiid.sbt

```text
name := "test"

version := "0.1"

scalaVersion := "2.11.12"

libraryDependencies ++= Seq(
  "org.apache.spark" % "spark-core_2.11" % "2.0.2"
)
```

**注意**: scalaバージョン2.12.8はうまくいかないみたい、バージョン**2.11.12**にしました。

## 例

```scala
import org.apache.spark.{SparkConf, SparkContext}

object BasicWordCount {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local").setAppName("Basic word count")
    val sc = new SparkContext(conf)

    val textFile = sc.textFile("./README.md")
    val words = textFile.flatMap(line => line.split(" "))
    val wordcounts = words.map(word => (word, 1)).reduceByKey((a, b) => a + b)

    wordcounts.saveAsTextFile("./wordcounts")
  }
}
```

## mavenの場合
mavenの場合は、設定はもうちょっと必要です。

- [Project Settings] -> [Libraries]のところに、spark-core_2.11を追加する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37718/bf6e5a7e-550b-af99-0511-7b7c755626cb.png)

- [Project Settings] -> [Global Libraries]　のところにscala-sdkを追加する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37718/97601d53-b364-f414-09fb-70e650f9aff8.png)


## 参照
- [Installation of the JDK and the JRE on macOS](https://docs.oracle.com/javase/9/install/installation-jdk-and-jre-macos.htm#JSJIG-GUID-C5F0BF25-3487-4F33-9275-7000C8E1C58C)
- [Java SE Development Kit 8 \- Downloads](https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)
- [Getting Started with Scala in IntelliJ \| Scala Documentation](https://docs.scala-lang.org/getting-started-intellij-track/getting-started-with-scala-in-intellij.html)