■ はじめに
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
【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 を使用していたため。
【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