我建了一个python module,我想在我的pyspark应用程序中导入它。
我的包目录结构是:
wesam/
|-- data.py
`-- __init__.py
在我的pyspark脚本顶部的一个简单的import wesam
导致ImportError: No module named wesam
。我还尝试将其拉链并将其与--py-files
作为recommended in this answer的代码一起运送,没有运气。
./bin/spark-submit --py-files wesam.zip mycode.py
我也按照this answer的建议以编程方式添加了文件,但是我得到了相同的ImportError: No module named wesam
错误。
.sc.addPyFile("wesam.zip")
我在这里错过了什么?
事实证明,由于我在client mode中提交我的应用程序,然后我运行spark-submit
命令的机器将运行驱动程序并将需要访问模块文件。
我将我的模块添加到我提交作业的节点上的PYTHONPATH
环境变量中,将以下行添加到我的.bashrc
文件中(或在提交我的作业之前执行它)。
export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules
这解决了这个问题。由于路径在驱动程序节点上,因此我不必使用--py-files
压缩和发送模块或使用sc.addPyFile()
。
解决任何pyspark模块导入错误问题的关键是了解驱动程序或工作程序(或两者)是否需要模块文件。
重要如果工作节点需要您的模块文件,则需要将其作为带有--py-files
的zip存档传递,并且此参数必须位于.py文件参数之前。例如,请注意这些示例中的参数顺序:
这是对的:
./bin/spark-submit --py-files wesam.zip mycode.py
这不正确:
./bin/spark-submit mycode.py --py-files wesam.zip
将mycode.py和wesam.py放在相同的路径位置并尝试
sc.addPyFile("wesam.py")
它可能会奏效。