如何使用 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__.pyutils1.pyutils2.py

注意:在导入

之前,您可能还需要使用 sc.addPyFile("utils.zip") 将此 zip 添加到 sc

您现在可以将它们用作

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