PySpark

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

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

Dockerを利用してPySpark実行環境(Jupyter Notebook)を用意する方法について解説します。

Dockerを利用してPySpark実行環境を用意する

PySparkとは

PySparkは、Apache Sparkという分散データ処理フレームワークをPythonで利用できるようにするAPIのことです。Apache SparkやPySparkの概要については「Apache SparkとPySparkの概要」でまとめていますので興味があれば参考にしてください。

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

上記のように表示がされれば、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の画面が起動します。

Jupyter Lab (pyspark-notebook)

workフォルダをダブルクリックするとworkフォルダに移動できます。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()
SparkSessionの作成

Sparkセッションを起動後に「http://localhost:4040/」を開くことで以下のようなSpark UIを起動することが可能です。

Spark UI

上記サンプルコードのようにSparkSessionを開始していない状態では、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を学ぶ際など実行環境を用意する際には、コンテナ環境を用意できるDockerを用いると簡単です。是非参考にしていただいてPySpark環境を準備してもらえればと思います。