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.py和wesam.py放在同一个路径位置试试
sc.addPyFile("wesam.py")
可能有用。
我构建了一个 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.py和wesam.py放在同一个路径位置试试
sc.addPyFile("wesam.py")
可能有用。