如何使用 pyspark 包含外部 python 模块
How to include external python modules with pyspark
我是 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-* 文件,而不是提供 utils
文件夹,在实际文件之前提供带有逗号分隔语法的 py 文件,如
'Args': ['spark-submit',
'--py-files',
'{your_s3_path_here}/utils/utils1.py,{your_s3_path_here}/utils/utils1.py',
'main.py']
}
最好压缩 utils 文件夹
您可以 zip
实用程序并像这样包含
为此,在 utils
中的根级别创建空 __init__.py
文件,例如 utils/__init__.py )
在此目录之外,将其压缩(例如 utils.zip
)
如需提交,您可以将此zip添加为
'Args': ['spark-submit',
'--py-files',
'{your_s3_path_here}/utils.zip',
'main.py'
}
考虑到您在 utils.zip
中有 __init__.py
、utils1.py
、utils2.py
注意:在导入
之前,您可能还需要使用 sc.addPyFile("utils.zip")
将此 zip 添加到 sc
您现在可以将它们用作
from utils.utils1 import *
from utils.utils2 import *
我是 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-* 文件,而不是提供 utils
文件夹,在实际文件之前提供带有逗号分隔语法的 py 文件,如
'Args': ['spark-submit',
'--py-files',
'{your_s3_path_here}/utils/utils1.py,{your_s3_path_here}/utils/utils1.py',
'main.py']
}
最好压缩 utils 文件夹
您可以 zip
实用程序并像这样包含
为此,在 utils
中的根级别创建空 __init__.py
文件,例如 utils/__init__.py )
在此目录之外,将其压缩(例如 utils.zip
)
如需提交,您可以将此zip添加为
'Args': ['spark-submit',
'--py-files',
'{your_s3_path_here}/utils.zip',
'main.py'
}
考虑到您在 utils.zip
__init__.py
、utils1.py
、utils2.py
注意:在导入
之前,您可能还需要使用sc.addPyFile("utils.zip")
将此 zip 添加到 sc
您现在可以将它们用作
from utils.utils1 import *
from utils.utils2 import *