PySparkの実行環境をDockerで用意する方法

Docker を利用して PySpark 実行環境 (Jupyter Notebook) を用意する方法について解説します。
目次
Docker を利用して PySpark 実行環境を用意する
PySpark とは
PySparkは、Apache Spark という分散データ処理フレームワークを Python で利用できる API のことです。Apache Spark や PySpark の概要については「Apache SparkとPySparkの概要」を参考にしてください。
PySpark のベースとなる Spark の環境は分散環境のため、実際に作るのは少し大変です。そのため、PySpark を学ぶ際に実行環境を用意するには Docker を用いると簡単です。Docker は、Docker Desktop をインストールするだけで利用できます。
この記事では、PySpark を使用可能な Jupyter Notebook 環境を作成する方法について紹介します。
PySpark 環境の構築方法
以降の説明では、Docker Desktop をインストールしていることを前提とします。インストールがまだの方は「Docker Desktop for Windowsのインストール方法」を参考にしてインストールをしていただければと思います。
PySpark の Docker イメージの取得
Docker では Docker Hub に様々なイメージが公開されています。今回は PySpark が使用できる Jupyter Notebook 環境を用意可能な pyspark-notebook のイメージを使ってみようと思います。
コマンドプロンプトで以下を実行すると、Docker イメージを取得できます。
docker pull jupyter/pyspark-notebook
Docker イメージの取得が完了すると以下のようになります。
>docker pull jupyter/pyspark-notebook Using default tag: latest latest: Pulling from jupyter/pyspark-notebook 707e32e9fc56: Pulling fs layer 38167cd797bc: Pulling fs layer 9e6b4fdd57ba: Pull complete 4f4fb700ef54: Pull complete f5338aaad745: Pull complete (===== 途中省略 =====) 6ad8cd711331: Pull complete 745ec7749fb3: Pull complete 6d2e31f8fbfc: Pull complete Digest: sha256:194a4664ca4347b4a78f331190d33110a3287976cea678db2d999f21b121782b Status: Downloaded newer image for jupyter/pyspark-notebook:latest docker.io/jupyter/pyspark-notebook:latest What's Next? View a summary of image vulnerabilities and recommendations → docker scout quickview jupyter/pyspark-notebook
取得した Docker イメージ一覧は「docker images」で確認ができます。
>docker images REPOSITORY TAG IMAGE ID CREATED SIZE jupyter/pyspark-notebook latest 068afe4a53e6 3 days ago 4.88GB
上記のように表示がされれば PySpark環境の Docker イメージ取得は完了です。
コンテナの作成と実行
Jupyter Notebook の起動
Docker イメージを取得したらコンテナを起動します。コマンドプロンプトで以下のコマンドを実行してください。
docker run --rm -it -p 8888:8888 -p 4040:4040 -v D:\docker\pyspark_notebook_1:/home/jovyan/work jupyter/pyspark-notebook
なお、「D:\docker\pyspark_notebook_1」の部分はお使いの環境の任意フォルダを指定してください。Docker コマンドの意味については後述します。
コンテナが起動すると、表示の中に「http://127.0.0.1:8888/lab?token=xxxxxxxxxx」というような記載の文字列が表示されるかと思います。xxxxxxxxx の部分は接続のためのトークンで起動ごとに異なります。
表示されたURLをブラウザに入力して実行すると Jupyter Lab の画面が起動します。

work フォルダは「D:\docker\pyspark_notebook_1」にマウントされているため、ここにファイルを保存するとローカルのフォルダにも保存がされます。
Notebook の部分の「Python3」をクリックすると以下のように Notebook が表示されプログラミングができます。このプログラムは、PySpark 環境で動作します。

Spark UI の起動
Spark は、実行時に driver や executor といったノードが連携して動作します。実行時にどのように処理が分散されたかを確認する際には「Spark UI」で確認できます。Spark UI を起動して確認する方法について見ていきましょう。
以下のような任意の PySpark コードを用意して SparkSession を開始します。
from pyspark.sql import SparkSession
# Sparkセッションの作成
spark = SparkSession.builder.appName("Example").getOrCreate()
Spark セッションを起動後に「http://localhost:4040/」を開くことで以下のようなSpark UI を起動できます。

Docker 起動コマンドの補足説明
ポートの接続 -p
Docker では、コンテナ側のポートとホストマシン(実行しているPC)のポートを接続できます。その際には「-p」オプションで指定します。Jupyter Notebook は標準で8888 番ポートで運用されます。「8888:8888」の部分は、ホスト側(左)の 8888 番ポートとコンテナ側(右)の 8888 番ポートを接続するという意味です。
同じように「4040:4040」の部分は、Spark UI に関するポートの接続です。ホスト側(左)の 4040 番ポートとコンテナ側(右)の 4040 番ポートを接続しています。
この例では、ホスト側のポートとコンテナ側を同じにしていますが、ホスト側のポートを変更することも可能です。
フォルダのマウント -v
Docker では、コンテナを削除するとデータが消えてしまいます。そのため、データを残しておくためには「-v」オプションで、ホスト側のフォルダとコンテナ側のディレクトリをマウントします。
今回の例ではホスト側の「D:\docker\pyspark_notebook_1」とコンテナの「/home/jovyan/work」をマウントしています。このようにすることで work フォルダに作成したファイルは「D:\docker\pyspark_notebook_1」に保存されます。
他の Docker コンテナと共有して使うこともできるので便利です。
コンテナのライフサイクル --rm , -it
「--rm」オプションはコンテナが終了した際に自動的にそのコンテナを削除します。これにより、不要なコンテナがシステムに残らないようにします。
「-it」オプションは、コンテナとのインタラクティブなセッションを開始します。これにより、コンテナ内での操作やデバッグが容易になります。
まとめ
Docker を利用して PySpark 実行環境 (Jupyter Notebook) を用意する方法について解説しました。
PySpark は、Apache Spark という分散データ処理フレームワークを Python で利用できるようにする API のことです。PySpark を使うことで、Python から Apache Spark の強力な分散処理機能を利用できるようになります。
PySpark のベースとなる Spark 環境は分散環境のため作るのは少し大変なため、実行環境を用意する際は Docker を用いると簡単です。是非参考にしていただいて PySpark 環境を準備してもらえればと思います。







