我试图将我的应用程序存档在我的测试文件中以激发EMR集群上的提交,如下所示:
模块的文件夹结构:
app
--- module1
------ test.py
------ test2.py
--- module2
------ file1.py
------ file2.py
我正在通过测试调用Zip函数
import zipfile
import os
def zip_deps():
# make zip
module1_path = '../module1'
module2_path = '../module2'
try:
with zipfile.ZipFile('deps.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
info = zipfile.ZipInfo(module1_path +'/')
zipf.writestr(info, '')
for root, dirs, files in os.walk(module1_path):
for d in dirs:
info = zipfile.ZipInfo(os.path.join(root, d)+'/')
zipf.writestr(info, '')
for file in files:
zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))
info = zipfile.ZipInfo(module2_path +'/')
zipf.writestr(info, '')
for root, dirs, files in os.walk(module2_path):
for d in dirs:
info = zipfile.ZipInfo(os.path.join(root, d)+'/')
zipf.writestr(info, '')
for file in files:
zipf.write(os.path.join(root, file),os.path.relpath(os.path.join(root, file)))
except:
print('Unexpected error occurred while creating file deps.zip')
zipf.close()
deps.zip是正确创建的,据我所知,它会压缩我想要的所有文件,每个模块文件夹都在zip的基础级别。事实上,使用:创建的确切拉链 zip -r deps.zip module1 module2 是相同的结构,当我提交它时,这是有效的
spark-submit --py-files deps.zip driver.py
EMR出错:
Traceback (most recent call last):
File "driver.py", line 6, in
from module1.test import test_function
ModuleNotFoundError: No module named 'module1'
FWIW我也尝试使用以下命令使用子进程进行压缩,并且在EMR中我在spark中得到了相同的错误
os.system("zip -r9 deps.zip ../module1")
os.system("zip -r9 deps.zip ../module2")
Zipfile使用相对目录保存完整文件名,例如:
../module1/test.py
spark除了顶层的文件夹外没有相对路径,如:
module1/test.py
我只需要改变我的写作就像这样:
with zipfile.ZipFile('deps.zip','w') as zipf:
for file in file_paths:
zipf.write(file,os.path.relpath(file,'..'))
如果您提取原始zip文件,您将永远不会看到../前面的名称。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。