PySpark + Jupyter Notebookの環境をDockerで構築する

お仕事でSparkをJupyter Notebook (Python 3) から使うかもしれないということで、PySparkの実験用環境をDockerで構築する方法について調べました。

今回は、PySpark APIを使ったJupyter Notebookの動作確認をローカルで完結できるようにすることをゴールにします (別ノードで計算させようとすると、sparkmagicやlivyの導入・設定が必要となるようです) 。

最初にpyspark-notebookイメージをプルして起動します。このイメージは、Jupyter Notebookのイメージ (jupyter/scipy-notebook) をベースに、Sparkのダウンロードや環境変数の設定 (SPARK_HOMESPARK_OPTSなど) が行われています。

https://hub.docker.com/r/jupyter/pyspark-notebook/

$ docker pull jupyter/pyspark-notebook

$ docker images jupyter/pyspark-notebook
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
jupyter/pyspark-notebook   latest              50a39e5a0bf6        3 days ago          5.45GB

$ docker run -p 8890:8888 -v /tmp/pyspark-notebook:/home/jovyan/work jupyter/pyspark-notebook start-notebook.sh

次に、Webブラウザを開いて、起動したJupyter Notebookへアクセスします (上の場合ですと、"http://localhost:8890"です) 。トークンが聞かれますので、起動時のコンソールで表示されるトークンを入力しましょう (最初からトークン付きURL "ttp://localhost:8890/?token=xxxxxxxx" でアクセスしても良いです) 。

Jupyter Notebook上でTerminalを開き、pysparkのシェルが起動できることを確認します。また"sc"でSparkContextインスタンスにもアクセスできることも確認できます。

では、Jupyter NotebookでPython 3のファイルを新規作成し、手始めにSparkContextを表示できることを確認します。

あとはPySparkのAPIで計算できるようになります (公式ドキュメントはこちら) 。

data = [1, 2, 3, 4, 5]

rdd = sc.parallelize(data)

rdd.sum()  # 15