我正在创建一个模块化的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运行代码吗?
这两种方式有什么不同吗? (逻辑和性能明智)
答案 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
了。