pyspark 导入用户定义的模块或 .py 文件

pyspark import user defined module or .py files

我构建了一个 python module,我想将它导入我的 pyspark 应用程序。

我的包目录结构是:

wesam/
|-- data.py
`-- __init__.py

我的 pyspark 脚本顶部的一个简单 import wesam 导致 ImportError: No module named wesam。我还尝试将其压缩并使用 --py-files 作为 与我的代码一起发送,但没有成功。

./bin/spark-submit --py-files wesam.zip mycode.py

我还按照 的建议以编程方式添加了文件,但我遇到了相同的 ImportError: No module named wesam 错误。

.sc.addPyFile("wesam.zip")

我在这里错过了什么?

事实证明,由于我在 client mode 中提交了我的申请,因此我 运行 来自 spark-submit 命令的机器将 运行 驱动程序和将需要访问模块文件。

我通过将以下行添加到我的 .bashrc 文件(或在提交我的作业之前执行它),将我的模块添加到我正在提交作业的节点上的 PYTHONPATH 环境变量中.

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.pywesam.py放在同一个路径位置试试

sc.addPyFile("wesam.py")

可能有用。