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

Posted

技术标签:

【中文标题】pyspark 导入用户定义的模块或 .py 文件【英文标题】:pyspark import user defined module or .py files 【发布时间】:2017-09-17 19:53:51 【问题描述】:

我构建了一个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")

我在这里错过了什么?

【问题讨论】:

【参考方案1】:

事实证明,既然我在client mode 中提交我的应用程序,那么我运行spark-submit 命令的机器将运行驱动程序并且需要访问模块文件。

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

export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules

这样就解决了问题。由于路径位于驱动程序节点上,因此我不必使用--py-filessc.addPyFile() 压缩和运送模块。

解决任何 pyspark 模块导入错误问题的关键是了解驱动程序或工作程序(或两者)节点是否需要模块文件。

重要 如果工作节点需要您的模块文件,那么您需要将其作为带有 --py-files 的 zip 存档传递,并且此参数 必须 在您的 .py 文件参数之前。例如,请注意这些示例中的参数顺序:

这是正确的:

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

这是正确的:

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

【讨论】:

虽然这可能有效,但您通过(可能)全局分布的 $HOME/.bashrc 有效地分布了您的环境。真的没有办法动态设置工作模块的 PYTHONPATH 吗?您想要这样做的原因是您正在与 ipython REPL 进行交互,并且想要发送依赖于 PYTHONPATH 中 NFS 上的模块的并行作业(想想 python setup.py 开发模式)。 @Wesam 很好的答案!您提到“解决任何 pyspark 模块导入错误问题的关键是了解驱动程序或工作程序(或两者)节点是否需要模块文件。” -- 你能推荐一个学习这个的好方法吗? @Wesam-nee 您建议在 pyspark 中分解应用程序。假设我已将我的大代码分解为三个 pyscript。运行这些脚本的最佳方式是什么?使用三个 shell 和 spark-submit 将它们作为不同的应用程序执行还是在一个 spark shell 中一起运行? 这对我很有效,谢谢。我也能够为单个模块指定一个 s3 位置。 清晰且乐于助人!非常感谢!【参考方案2】:

mycode.pywesam.py放在同一个路径位置试试

sc.addPyFile("wesam.py")

它可能会起作用。

【讨论】:

以上是关于pyspark 导入用户定义的模块或 .py 文件的主要内容,如果未能解决你的问题,请参考以下文章

pyspark addPyFile 添加 .py 文件的 zip,但仍未找到模块

python如何导入自定义文件和模块全部方法

如何设置Pyspark在Python 3火花env.sh.template

模块的导入

模块导入循环导入模块查找顺序相对导入及绝对导入

python如何导入自定义模块