首页 > 解决方案 > 如何使用 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

怎么了?

标签: pythonamazon-web-servicesapache-sparkpysparkamazon-emr

解决方案


虽然不推荐(请参阅完整答案以获得更好的选择),但如果您不想压缩文件。除了提供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.pyutils.zip

注意:sc.addPyFile("utils.zip")在进行导入之前,您可能还需要将此 zip 添加到 sc

您现在可以将它们用作

from utils.utils1 import *
from utils.utils2 import *

推荐阅读