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

时间:2017-11-08 10:12:37

标签: python apache-spark pyspark project-structure modular

我正在创建一个模块化的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文件,否则它们会自动导入。

我的帖子中提到了压缩src文件夹并将其作为参数传递给--py-files。

哪种方法正确?

我应该像现在这样保留当前结构并从main.py运行代码吗?

这两种方式有什么不同吗? (逻辑和性能明智)

2 个答案:

答案 0 :(得分:0)

在本地运行时,无需使用--py-files标志传递其他模块作为zip,您的代码是本地的,主人和工作人员也是如此(他们都可以访问您的代码和模块)。 / p>

但是,当您要将作业提交到群集时,主人和工作人员需要访问您的main.py文件及其使用的所有模块,因此,使用{{1} }参数,您指定了额外模块的位置,主服务器和工作者都可以访问需要运行的代码的每个部分。如果您只是在群集上运行--py-files,它就无法工作,因为1)main.py的位置相对于您的系统,因此群集无法找到main.py 2)由于main.py的ImportErrors。

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

main.py

修改:对于spark-submit --master mesos://path/to/service/spark --deploy-mode cluster --py-files http://somedomainforfileserving/src.zip http://somedomainforfileserving/main.py 个依赖关系,例如在ElasticSearch连接器中,您可以将jar放在jar内,例如在src中,以便将其压缩并分发给所有人,然后在提交到群集时,引用相对于jar的src/jars路径。 E.g:

src

答案 1 :(得分:0)

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