Livy+SparkmagicでWSL上のSparkをWindows側のJupyter notebookから使う

やりたいこと

Windows上に入れたSparkとJupyter Nootbookで開発していたら、Windowsディレクトリ構成やファイル操作とかにイライラとしてLinuxで開発したくなりました。

でも、せっかくWindowsに戻ってこられたところなので、何とかデュアルブートLinuxに戻りたくはないと考え、WSL上のSparkをJupyterでリモート操作できる環境を整えました。

f:id:yomon8:20181204171136p:plain

利用リポジトリ

AWS Glueを使っていても、よく目にするこの2つのリポジトリを使います。

Apache Livy

REST経由でSparkクラスタを操作できるサービス

github.com

Sparkmagic

Livyを通してリモートのSparkクラスタをJupyter notebookから操作するツール

github.com

使い方はここがわかりやすいです。

sparkmagic/Spark Kernel.ipynb at master · jupyter-incubator/sparkmagic · GitHub

WSLでSparkをダウンロード

Sparkの2.1.0をダウンロードして展開しておきます。どうも2.1.0でないとSparkmagicとLivyの通信が動かないようです。

$ wget https://archive.apache.org/dist/spark/spark-2.1.0/spark-2.1.0-bin-hadoop2.7.tgz
$ tar xf spark-2.1.0-bin-hadoop2.7.tgz

最新のタグでもDockerfile見る限りは、Spark 2.1.0のLivy v0.3.0でテストされているようです。

https://github.com/jupyter-incubator/sparkmagic/blob/0.12.6/Dockerfile.spark

確かにそれ以降のLivyだと以下のようなSASLのネゴシエーションエラーが出て動かない。解決まではいけなそうなので、このまま使うことにしました。

18/12/04 11:49:56 ERROR RSCClient: RPC error.
  javax.security.sasl.SaslException: Client closed before SASL negotiation finished.

WSLでLivyインストール&ビルド

LivyのビルドにはJavaの1.7か1,.8が必要なので、別のバージョン使っている場合は切り替え。

$ sudo update-alternatives --config java

上に書いたように最新のソースはエラーが出て繋げなかったので、Sparkmagicから動くv0.3.0をチェックアウトしてビルドします。

かなり時間かかります。

$ git clone git@github.com:cloudera/livy.git
$ cd livy/
$ git checkout -f v0.3.0
$ mvn -Dspark.version=2.1.0 -DskipTests package

ビルドが完了したら、ログ出力用のディレクトリを作ってLivyを起動しておきます。

$ mkdir logs
$ SPARK_HOME=/home/yomon8/lib/spark-2.4.0-bin-hadoop2.7  ./bin/livy-server

この際に、Sparkmagicを動かすコンピュータから接続確認しておきます。

$ curl http://localhost:8998/sessions
{"from":0,"total":0,"sessions":[]}

Sparkmagic

Sparkmagicのセットアップです。本体のWindowsで行いました。READMEに沿って行えば特に迷うところはありません。

> pip install sparkmagic
> jupyter nbextension enable --py --sys-prefix widgetsnbextension 
> pip show jupyter
#---省略
Location: c:\python27\lib\site-packages
#---省略

> cd c:\python27\lib\site-packages # Locationへ移動

# 必要なKernelをインストール
> jupyter-kernelspec install sparkmagic/kernels/sparkkernel
> jupyter-kernelspec install sparkmagic/kernels/pysparkkernel
> jupyter-kernelspec install sparkmagic/kernels/pyspark3kernel
> jupyter-kernelspec install sparkmagic/kernels/sparkrkernel

Jupyter notebookを起動して、インストールされたカーネルがJupyterから利用できるようになっていることを確認します。

> jupyter notebook

f:id:yomon8:20181204174903p:plain

これで、WSL側のSparkをWindows側から使えます。

f:id:yomon8:20181204210737p:plain

他のSparkのバージョン

SASLのネゴシエーションで失敗してしまって繋がらないです・・ いつか方法わかったら追記します。

参考URL

JupyterからSpark clusterを操作できるlivy + sparkmagicを試してみた - once upon a time,

https://livy.apache.org/