背景
Sparkでデータの重複を除外したいので、sparkの開発環境をローカルで作ってみた。
macOS 10.14.2
必要な物
- JDK
- Scala
- Spark
- IntelliJ
- sbt
Sparkの開発環境作成
JDK
もともとjdk1.8.0_11
がインストール済みですが、そのバージョンだとうまく行かなかったので、手動で最新のJDKに更新した。
ちなみに、macOSにはデフォルトJREをインストールされてますが、JDKがないです。
「システム設定」-> 「Java」で更新してもJREしか更新されないです。
- 古いJDKを消す
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk
- 最新のJDKをインストール
- Java SE Development Kit 8 - Downloads
- Download and install
- 環境変数を設定
~/.bash_profile
export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/"
export PATH=$JAVA_HOME/bin:$PATH
Scala
- Scalaをインストール
brew install scala
brew install scala@2.11
Intellijだけを使うなら、ここでscalaをインストールしなくてもよいですが、インストールしておいても損はないでしょう。
自分はscala 2.11も使いたいので、別でscala2.11もインストールした。
- 環境変数設定
~/.bash_profile
export SCALA_HOME="/usr/local/Cellar/scala@2.11/2.11.12/"
export PATH=$SCALA_HOME/bin:$PATH
Spark
- sparkをインストール
$ brew search spark
==> Formulae
apache-spark ✔ spark sparkey
==> Casks
homebrew/cask/spark
apache-spark
とspark
ともありますが、spark
は全然別のものです。apache-spark
をインストールしましょう。
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を指定しましょう。
- buiid.sbt
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にしました。
例
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を追加する
- [Project Settings] -> [Global Libraries] のところにscala-sdkを追加する