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