【トラブル】PySpark 環境構築時のトラブルシューティング

■ はじめに

https://dk521123.hatenablog.com/entry/2019/09/18/214814
https://dk521123.hatenablog.com/entry/2019/11/14/221126

で、PySpark を構築した際に発生したトラブルを纏める

目次

【1】エラー「Py4JError: xxx does not exist in the JVM」が表示
【2】エラー「TypeError: an integer is required (got type bytes)」が表示
【3】エラー「ModuleNotFoundError: No module named 'py4j'」が表示

【1】エラー「Py4JError: xxx does not exist in the JVM」が表示

「spark_context = SparkContext()」を実行時に
以下のようなエラーを表示する

エラー内容

To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Traceback (most recent call last):
  File "c:\work\python\demo.py", line 3, in <module>
    spark_context = SparkContext()
  File "C:\Users\xxxx\.msvscode.hdinsight\hdinsightJupyter\lib\site-packages\pyspark\context.py", line 146, in __init__
    self._do_init(master, appName, sparkHome, pyFiles, environment, batchSize, serializer,       
  File "C:\Users\xxxx\.msvscode.hdinsight\hdinsightJupyter\lib\site-packages\pyspark\context.py", line 224, in _do_init
    self._encryption_enabled = self._jvm.PythonUtils.isEncryptionEnabled(self._jsc)
  File "C:\Users\xxxx\.msvscode.hdinsight\hdinsightJupyter\lib\site-packages\py4j\java_gateway.py", line 1530, in __getattr__
    raise Py4JError(
py4j.protocol.Py4JError: org.apache.spark.api.python.PythonUtils.isEncryptionEnabled does not exist in the JVM

解決案

環境変数を設定する

SPARK_HOME  =>  C:\work\spark-2.4.4-bin-hadoop2.7
PYTHONPATH  =>  %SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-0.10.9-src.zip;
C:\Program Files\Java\jdk-13\bin; %SPARK_HOME%\bin

参考文献
https://stackoverflow.com/questions/53217767/py4j-protocol-py4jerror-org-apache-spark-api-python-pythonutils-getencryptionen

【2】エラー「TypeError: an integer is required (got type bytes)」が表示

PySparkを実行した際に、cloudpickle.py内で以下の例外が発生する

エラー内容

Traceback (most recent call last):
  File "C:\software\spark-2.4.4-bin-hadoop2.7\bin\..\python\pyspark\shell.py", line 31, in <module>
    from pyspark import SparkConf
  File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\__init__.py", line 51, in <module>
    from pyspark.context import SparkContext
  File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\context.py", line 31, in <module>
    from pyspark import accumulators
  File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\accumulators.py", line 97, in <module>
    from pyspark.serializers import read_int, PickleSerializer
  File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\serializers.py", line 71, in <module>
    from pyspark import cloudpickle
  File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\cloudpickle.py", line 145, in <module>
    _cell_set_template_code = _make_cell_set_template_code()
  File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\cloudpickle.py", line 126, in _make_cell_set_template_code
    return types.CodeType(
TypeError: an integer is required (got type bytes)

原因

* pyspark 2.4.4系は、Python3.8以上はサポートしていないが
 Python3.9 を使用していたため。

参考文献
https://knews.vip/postcrawl/stack/view?site=so&key=71698182&alias=spark-2-4-4-no-insuto-rugo-ni-pyspark-o-jikkoshiyou-to-suru-to-typeerror-seisu-ga-hitsuyo-desu-taipu-baito-o-shutok

【3】エラー「ModuleNotFoundError: No module named 'py4j'」が表示

PySparkを実行したら、
エラー「ModuleNotFoundError: No module named 'py4j'」が表示。

原因

py4j-X.XX.X-src.zipがPYTHONPATH  に指定されていなかったため

解決案

環境変数を設定する

PYTHONPATH  =>  %SPARK_HOME%\python;%SPARK_HOME%\python\lib\py4j-0.10.9-src.zip;

参考文献
https://qiita.com/makainuma/items/9350b62ef72736a448f6
https://stackoverflow.com/questions/56342655/modulenotfounderror-no-module-named-py4j

関連記事

PySpark ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2019/11/14/221126
Apache Spark ~ 環境設定 / Windows編 ~
https://dk521123.hatenablog.com/entry/2019/09/18/214814