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

Wes*_*sam 21 python python-module python-import apache-spark pyspark

我构建了一个python模块,我想在我的pyspark应用程序中导入它.

我的包目录结构是:

wesam/
|-- data.py
`-- __init__.py
Run Code Online (Sandbox Code Playgroud)

import wesam我的pyspark脚本顶部的一个简单导致ImportError: No module named wesam.我也试图压缩它与我的代码以出货--py-files推荐这个答案,没有运气.

./bin/spark-submit --py-files wesam.zip mycode.py
Run Code Online (Sandbox Code Playgroud)

我也按照这个答案的建议以编程方式添加了文件,但是我得到了同样的ImportError: No module named wesam错误.

.sc.addPyFile("wesam.zip")
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

Wes*_*sam 44

事实证明,由于我在客户端模式下提交我的应用程序,因此我运行spark-submit命令的机器将运行驱动程序并需要访问模块文件.

在此输入图像描述

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

export PYTHONPATH=$PYTHONPATH:/home/welshamy/modules
Run Code Online (Sandbox Code Playgroud)

这解决了这个问题.由于路径在驱动程序节点上,因此我不必使用--py-files或使用压缩和运输模块sc.addPyFile().

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

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

这是对的:

./bin/spark-submit --py-files wesam.zip mycode.py
Run Code Online (Sandbox Code Playgroud)

正确:

./bin/spark-submit mycode.py --py-files wesam.zip
Run Code Online (Sandbox Code Playgroud)

  • @Wesam很棒的回答!您提到"解决任何pyspark模块导入错误问题的关键是了解驱动程序或工作程序(或两者)节点是否需要模块文件." - 你能推荐一个学习这个的好方法吗? (2认同)