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
。
我正在创建一个本质上是模块化的 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
。