はじめに
WindowsでSpark(Pyspark)の環境構築を行った際に、エラーの解決方法がわからずハマってしまったので、備忘録として共有したいと思います。もし間違っている箇所などあればご指摘いただけると幸いです。
##当初参考にしたサイト
##ハマったエラー内容
上記サイトおよびYoutube動画を参考にインストールし、下記コードをJupyter notebookで実行したところエラーとなりました。
#####コード
import findspark
findspark.init()
import pyspark # only run after findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
df = spark.sql('''select 'spark' as hello ''')
df.show()
#####エラー文
Exception: Java gateway process exited before sending the driver its port number
このエラー文でググったところstackoverflowのスレッドも見つかりましたが、色々な可能性が示唆されていて正直何のこっちゃという感じでした。これらをもとに四苦八苦しながら6時間くらいかかって解決したので、やったこと(かつ効果があったと思われるもの)を以下列挙します。最終的には、Javaのバージョン変更が効きました
##試したこと
#####JavaとSparkのフォルダ位置の変更
JavaはデフォルトだとProgram Filesの下にインストールされると思います。このコメントにもあるように、フォルダ名にスペースがあるとうまくいかないらしく、Cドライブの直下に移動しました(C:\Java)。
同様に、SparkもCドライブ直下に置きました。
#####環境変数の変更
当初参考にしたサイトのB5にあったように、JAVA_HOMEという環境変数をC:\Javaとして追加しました(パスはご自身の環境に合わせて変えてください。私の場合はCドライブの直下にJavaを入れていたためC:\Javaになっています)。
#####Sparkとwinutils.exeのバージョン変更
Apache Sparkをインストールする際に何も考えずにデフォルトのバージョンを選択していたのですが、デフォルトだと下記画像のようにHadoopのバージョンは3.2になっていました。
しかし、Hadoop binaryの配布サイトでは、3.2のバージョンは2021/07現在存在しません。なので、Sparkのバージョンを"Pre-built for Apache Hadoop 2.7"で再インストールし、winutils.exeも2.7.1のものをダウンロードしてSparkのbin直下に置きなおしました。
(*こちらはHadoopの話のため当初のコードを動かすのには関係ないかもしれませんが、後々悪影響があるかもしれないので行っておきました)
#####Pythonのバージョン変更
Pythonのバージョンは3.8だったのですが、Sparkの公式ドキュメントを見ると、"Spark runs on Java 8/11, Scala 2.12, Python 3.6+ and R 3.5+"とあります。
こちらが原因かはわかりませんが、念のため古いバージョンのPythonを再インストールしました。Anacondaでのバージョン対応表についてはこちらを参考にしました。
#####Javaのバージョン変更
stackoverflowでもJavaのバージョンが問題だったという書き込みが複数ありました。
Java 16を元々はダウンロードしていたのですが、OracleのサイトからJava 8を再ダウンロードしました(アカウント作成を求められるかもしれません)。
##結果
Javaのバージョン変更を行った後にJupyter notebook上で元々のコードを実行すると、、
なんとか動いてくれました!
以上、私のようにWindowsでJupyter notebook上でPyspark動かしたいけどハマっている方に参考になれば幸いです。
##追記
翌日同じように動かそうとすると下記エラーにぶち当たりました(なぜ前日上手くいっていたのかよくわからないですが、、)。
py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.getEncryptionEnabled does not exist in the JVM
エラー文で色々とググったところ、Stackoverflowのこの記事を見つけました。要するに、PysparkとSparkのバージョンを一緒にしないといけないということですね。Anaconda Powershellで
pip freeze
で調べてみるとPysparkのバージョンは3.1.2でした。以前ダウンロードしたSparkは3.0.3だったので、改めて3.1.2のSparkを再ダウンロードしたところきちんと動くようになりました。