ちょっとした時のSpark/Scalaコードをチームに共有する際、
Jupyterノートブックとしてコードを共有できる方がいいかと思い、
- Pythonのインストール
- Sparkのインストール
- ノートブックでのコードの実行
こららの一連の手順についてまとめてみました。
よくあるApache Toreeを使った手順になっています。
Python(Anaconda)のインストール
pyenvのインストール
$ brew update
$ brew install pyenv
環境変数の設定
$ echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.zshrc
$ echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.zshrc
$ echo 'eval "$(pyenv init -)"' >> ~/.zshrc
$ exec $SHELL -l
Anacondaのインストール
インストール可能なanacondaのバージョン一覧を取得する。
$ pyenv install -l | grep anaconda
anaconda-1.4.0
anaconda-1.5.0
...
anaconda3-5.3.1
anaconda3-2018.12
現時点の最新版をインストールします。
$ pyenv install anaconda3-5.3.1
バージョンを最新のものに切り替えます。
# バージョンの設定
$ pyenv global anaconda3-5.3.1
# 切り替わったことの確認
$ pyenv versions
system
* anaconda3-5.3.1 (set by /Users/yuichi.nagakura/.pyenv/version)
一回ログアウトしてからPythonのバージョンを確認します。
$ python -V
Python 3.7.0
Jupyterもインストールされているか確認します。
$ jupyter --version
4.4.0
Apache Sparkのインストール
Apache Toreeを使うには、Sparkが必要になります。
Sparkをインストールします。
# ダウンロード
$ curl -O http://ftp.kddilabs.jp/infosystems/apache/spark/spark-2.4.0/spark-2.4.0-bin-hadoop2.7.tgz
# 解凍
$ tar xvfz spark-2.4.0-bin-hadoop2.7.tgz
# シンボリックリンクの作成
$ ln -s $HOME/spark-2.4.0-bin-hadoop2.7 $HOME/spark
環境変数を設定します。
$ echo 'export SPARK_HOME=$HOME/spark' >> ~/.bash_profile
$ echo 'export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin' >> ~/.bash_profile
$ source ~/.bash_profile
Apache Toreeのインストール
参考) Apache Toree Quickstart
https://toree.apache.org/docs/current/user/quick-start/
$ pip install --upgrade toree
$ jupyter toree install --spark_home=$SPARK_HOME --interpreters=Scala
これで準備完了です。
Jupyter Notebookの起動
ノートブックを起動します。
私はSparkContext
が必要なかったことと、ローカルモードでSparkを使いたかったので、以下のようにオプションを指定して起動しています。
$ TOREE_OPTS='--nosparkcontext' SPARK_OPTS='--master=local[2]' jupyter notebook
ScalaコードをJupyterNotebookに書く
New
→Apache Toree Scala
を選択してノートブックを作成します。

コードは以下のような感じで書いてみました。
コードと実行結果を記録として残せるのでいい感じです。

ハマったポイントとして、ノートブックで実行する場合には、sparkセッション生成時にenableHiveSupport
をつけないと、MetaStoreが有効にならなかったことくらいでしょうか。MetaStoreのデータベースをMySQLやPostgreSQLなどのDBを使っていない場合は不要っぽいです。
val spark = SparkSession.builder()
.enableHiveSupport
.master("local")
.getOrCreate()