python - 如何使用 pyspark 包含外部 python 模块
问题描述
我是 python 新手,正在尝试在 AWS EMR 上的 spark 上启动我的 pyspark 项目。该项目部署在 AWS S3 上,并且有几个 python 文件,如下所示:
/folder1
- main.py
/utils
- utils1.py
- utils2.py
我使用以下命令:
spark-submit --py-files s3://bucket/utils s3://bucket/folder1/main.py
但我得到了错误:
Traceback (most recent call last):
File "/mnt/tmp/spark-1e38eb59-3ddd-4deb-8529-eace7465b6ce/main.py", line 15, in <module>
from utils.utils1 import foo
ModuleNotFoundError: No module named 'utils'
我必须在我的命令中修复什么?我知道我可以将我的项目打包成 zip 文件,但现在我需要在不打包的情况下进行打包,但是如果您告诉我这两种解决方案,我将不胜感激。
升级版:
EMR 集群的控制器日志显示,启动命令如下所示:
hadoop jar /var/lib/aws/emr/step-runner/hadoop-jars/command-runner.jar spark-submit --packages org.apache.spark:spark-avro_2.12:3.1.1 --driver-memory 100G --conf spark.driver.maxResultSize=100G --conf spark.hadoop.fs.s3.maxRetries=20 --conf spark.sql.sources.partitionOverwriteMode=dynamic --py-files s3://bucket/dir1/dir2/utils.zip --master yarn s3://bucket/dir1/dir2/dir3/main.py --args
但现在我有以下错误:
java.io.FileNotFoundException: File file:/mnt/var/lib/hadoop/steps/cluster-id/dir1/dir2/utils.zip does not exist
怎么了?
解决方案
虽然不推荐(请参阅完整答案以获得更好的选择),但如果您不想压缩文件。除了提供utils
文件夹之外,您还可以在实际文件之前提供带有 py-files 的单个 utils-* 文件,并以逗号分隔的语法作为
'Args': ['spark-submit',
'--py-files',
'{your_s3_path_here}/utils/utils1.py,{your_s3_path_here}/utils/utils1.py',
'main.py']
}
最好压缩 utils 文件夹
您可以zip
像这样使用和包含
为此,请__init__.py
在根级别创建空文件,utils
如 utils/__init__.py )
在此目录之外,对其进行压缩(例如utils.zip
)
对于提交,您可以将此 zip 添加为
'Args': ['spark-submit',
'--py-files',
'{your_s3_path_here}/utils.zip',
'main.py'
}
考虑到你有__init__.py
, utils1.py
,utils2.py
在utils.zip
注意:sc.addPyFile("utils.zip")
在进行导入之前,您可能还需要将此 zip 添加到 sc
您现在可以将它们用作
from utils.utils1 import *
from utils.utils2 import *
推荐阅读
- homebrew - 错误:qt@5.5:未知版本:mountain_lion
- android - 如何将可绘制对象的动态路径传递给 BitmapFactory.decoreResource() 的第二个参数
- c# - 如何在 C# 中优雅地填充异构数组
- angular - 为什么新部署的 Angular 应用不加载组件?
- makefile - 在pdf之前不要构建点文件
- javascript - 如何从多个多维数组中创建所有可能的变化?
- opencv - 为什么 OpenCV 4.0.1 中的 VideoCapture 在 Windows 10 的 Anaconda 环境中不起作用?
- node.js - 使用 npm 作为构建工具分发命令行参数
- sql - 如果数据可以出现在两列中,如何在 SQL 中对数据进行平均然后排序?
- sql - PLSQL - 比较两个逗号分隔并删除重复