久しぶりで pyspark 立ち上げたら No module named 'py4j' と出た。
で、ぐぐったら、悉く環境変数PYTHONPATHにspark配布物の中の py4j の src zip ファイルを登録しろということだったんだが、やってみると全く改善しない。
結局、この件、 ipython が PYTHONPATH から zip を読み込まないことが原因だった。
$ python3.7
Python 3.7.4 (default, Jul 9 2019, 18:13:23)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import py4j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'py4j'
>>>
$ env PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.7-src.zip python3.7
Python 3.7.4 (default, Jul 9 2019, 18:13:23)
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import py4j
>>>
$ env PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.10.7-src.zip ipython
Python 3.7.4 (default, Jul 9 2019, 18:13:23)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.7.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: import py4j
---------------------------------------------------------------------------
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-1-cf59b57a4c3e> in <module>
----> 1 import py4j
ModuleNotFoundError: No module named 'py4j'
In [2]:
Do you really want to exit ([y]/n)? y
export PYSPARK_DRIVER_PYTHON=ipython
してあったため ipython が動いていた& dot file 書き換えて xterm 起動しても最初に読み込んだ dot file で設定してしまった PYSPARK_DRIVER_PYTHON が引き継がれて、これ殺しても No module named 'py4j' 出るなぁとしばらくハマった。
見つかった例を見るとほぼ全て、 SPARK_HOME
を環境変数で設定しているけど、これ PYTHONPATH
に展開させるためだけにあって spark 自体は参照していないので正しいんだよな。今まで設定したことないし。
なんかこう仕組みもわからず全部環境変数って辞めませんかね