Pyspark:是否需要在项目中将附加模块作为 --py-files 参数传递

Pyspark: Is it required to pass additional modules as --py-files argument in a project

我正在创建一个本质上是模块化的 pyspark 应用程序。我的代码结构是这样的:

├── main.py
├── src
│   ├── __init__.py
│   ├── jobs
│   │   ├── __init__.py
│   │   └── logic.py
│   └── utils
│       ├── __init__.py
│       └── utility.py

我的启动脚本是main.py,它依次调用logic.py文件中的逻辑函数。

我正在 运行我的项目 spark-submit main.py

我的问题是我是否需要在 spark-submit 命令中提及其他 .py 文件,否则它们会自动导入。

我遇到一个 post,其中提到压缩 src 文件夹并将其作为 --py-files 中的参数传递。

哪种方法正确?

我应该像我一样保留 main.py 的当前结构和 运行 代码吗?

这两种方式有什么区别吗? (逻辑和性能方面)

当 运行 在本地使用 --py-files 标志时,不需要将附加模块作为 zip 传递,您的代码是本地的,master 和 worker 也是本地的(他们都可以访问您的必要的代码和模块)。

然而,当您想要向集群提交作业时,master 和 worker 需要能够访问您的 main.py 文件,以及它使用的所有模块,因此,使用 --py-files 参数,您正在指定额外模块的位置,并且 master 和 workers 都可以访问需要 运行 的代码的每个部分。如果你只是 运行 spark-submit main.py 在集群上,它不会工作,因为 1) main.py 的位置是相对于你的系统的,所以集群将无法定位 main.py 和 2) 由于 main.py.

的导入错误

注意:此标志的使用是在指定 main.py 之前,并且压缩文件(以及 main.py)需要位于整个集群都可以访问的某个位置,而不是您机器上的本地,例如在 ftp 服务器上。 例如通过mesos在集群上提交:

spark-submit --master mesos://path/to/service/spark --deploy-mode cluster --py-files http://somedomainforfileserving/src.zip  http://somedomainforfileserving/main.py

编辑:至于jar依赖项,例如ElasticSearch 连接器,您可以将罐子放在 src 中,例如在 src/jars 中,以便它被压缩并分发给所有人,然后在提交到您的集群时,引用相对于 src 路径的 jar。例如:

spark-submit --master mesos://path/to/service/spark --deploy-mode cluster --jars src/jars/elasticsearch-spark-someversion.jar --py-files http://somedomainforfileserving/src.zip  http://somedomainforfileserving/main.py

是的,压缩您的项目然后提交就可以了。
移动到您的项目文件夹。 运行 zip -r myproject.zip . .
现在您可以在终端中 spark-submit --py-files myproject.zip main.py