5
3

More than 3 years have passed since last update.

初心者がPysparkをJupyter notebookで動かすのに6時間かかった話

Last updated at Posted at 2021-07-13

はじめに

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になっていました。
image.png
しかし、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上で元々のコードを実行すると、、
image.png

なんとか動いてくれました!


以上、私のように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を再ダウンロードしたところきちんと動くようになりました。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3