急遽仕事で、Azure SynapseのNotebook上のPySparkを使うことになったので、自宅でもPySparkを実行できる環境がほしくなりました。
PySparkはPythonを使用してApache Sparkの機能を活用できるツールです。
ビッグデータの処理や分析を高速に行うためのオープンソースのフレームワークで、並列処理や分散処理をサポートしています。
PySparkを使用して分散処理を行う際、実行環境のCPUやメモリのリソースに大きく依存します。
ですのでCPUのコア数が多いほど並列処理が効率的に行え、処理時間が短縮されるわけですが、ローカルで実行するとなるとある程度のスペックがないとジョブの実行が遅くなります。
実際、本記事で構築する環境は実務で使用するのに比べるとコア数が少ない場合が多いとは思いますが、処理速度自体は割り当てるコア数をいくつにするかに依存します。
Docker imageを使って、いざ構築
このへんは人によるとは思うのですが、あまりPC内にソフトウェアをインストールしたくないため、簡単に行える環境構築がよいと考えたので、今回はDocker imageを用いることにしました。
それだけではなく、PySparkの環境を整えるのにはJVM上で動作するPython(Py4J)の利用、Apache Sparkのインストールなどをする必要があるのもDockerを使う理由になります。
個人的にはJupyter Notebookはあまり好きではないのですが(使っている人多いと思いますすみません)、これらの手間を考えると喜んで使用させていただきます。
以下、私の環境。(一応環境を書いていますが、Dockerが使える環境であればコマンドは共通)
- Windows11 Pro
- WSL2
- docker desktop 4.28.0
- Ubuntu 22.04.3 LTS
まずはDocker imageを取得します。
docker pull jupyter/pyspark-notebook
取得完了したら念のため以下コマンドで確認。
docker images
“jupyter/pyspark-notebook”が表示されていればOKです。
あとは取得したイメージのコンテナを実行するだけです。
docker run --rm -it -p 8888:8888 -p 4040:4040 -v c:/Users/xxx:/temp jupyter/pyspark-notebook
以下、docker runのオプション説明。
# コンテナの実行が終了した際に、自動的にコンテナを削除する。
--rm
# -i はインタラクティブモードでコンテナを起動、-t は仮想端末の割り当て
--it
# ホストのコンテナのポートをマッピング。
# 8888はjupyter notebook用
# 4040はPySparkのWeb UI(Spark UI)用
-p 8888:8888
-p 4040:4040
# ボリュームのマウント。ホスト:コンテナのそれぞれのディレクトリをマッピング。
# WSL2を使っている場合のホスト側は /mnt/c/... とする。
-v ホスト側:コンテナ側
実行後にターミナルにURLとtokenが表示されるのでそちらにアクセスすれば、jupyter notebookは使用可能です。
http://127.0.0.1:8888/lab?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ボリュームのマウントを行っていれば、作成したipynbファイルもホスト側に保存されていますし、CSVファイルやJSONファイルなどのnotebookで読み込ませたいファイルの格納も簡単です。
from pyspark.sql import SparkSession
from pyspark.sql import Row
# Sparkセッションの作成
spark = SparkSession.builder \
.appName("ExampleSpark") \
.getOrCreate()
# サンプルデータの作成
data = [Row(name="Alice", age=25), Row(name="Bob", age=30), Row(name="Charlie", age=35)]
# データフレームの作成
df = spark.createDataFrame(data)
# データフレームの表示
df.show()
# Sparkセッションの停止
spark.stop()
この環境で体感できるかはわかりませんが、Pandasだと処理時間が膨大にかかる処理でもPySparkはかなり早く処理が完了します。
ただPandasに慣れているので、PySparkの記述を都度調べて実装している状態です。