Slurm集群上Snakemake重复下载Zenodo文件报错,本地运行正常
问题分析与解决
核心问题
在Slurm集群环境下,使用Snakemake 8.11.6搭配Slurm执行器运行工作流时,Zenodo存储插件对a.tar.gz的重复下载触发了429请求限制错误,但b.tar.gz和Git仓库相关步骤运行正常;本地执行完全无异常。
可能原因及对应解决方案
1. 跨节点缓存路径不统一
- 原因:
--keep-storage-local-copies在集群中,不同Slurm节点的本地缓存路径未共享,导致每个节点都重新下载a.tar.gz;而b.tar.gz解压后文件名与Git目录b的文件同名,Snakemake直接复用了Git中已存在的文件,跳过了重复下载。 - 解决:
- 指定共享存储路径作为统一缓存目录,通过
--storage-zenodo-local-prefix参数配置:snakemake --profile <profile> --keep-storage-local-copies --storage-zenodo-local-prefix /scratch/user/shared_cache --sdm conda --configfile config/config.yml --directory /scratch/user/something - 检查Slurm profile配置,确保所有作业使用统一的工作目录和缓存相关环境变量,避免节点本地临时目录被重复调用。
- 指定共享存储路径作为统一缓存目录,通过
2. Checkpoint输出跟踪失效
- 原因:
work_a依赖a.tar.gz解压后的多文件,这些文件由checkpoint生成,集群模式下Snakemake无法正确关联checkpoint输出文件与a.tar.gz的依赖关系,导致wildcard触发时反复发起存储请求。b.tar.gz因同名文件已存在于Git目录,无需触发下载。 - 解决:
- 在checkpoint规则中显式指定输出路径,并添加
persist=True参数确保文件被持久化跟踪:checkpoint get_a_data: output: directory("a_unpacked"), persist=True shell: "zenodo-get <a-tar-url> | tar xzf - -C a_unpacked" - 在
work_a规则中明确依赖checkpoint输出的完整路径,避免wildcard匹配的模糊性。
- 在checkpoint规则中显式指定输出路径,并添加
3. 存储缓存验证逻辑异常
- 原因:集群共享存储的元数据同步延迟、文件权限问题,导致Snakemake每次都判定
a.tar.gz缓存失效,重新下载;b.tar.gz因Git文件的哈希匹配通过,无需验证Zenodo存储文件。 - 解决:
- 手动预下载
a.tar.gz到共享缓存目录,确保权限正确:zenodo-get <a-tar-url> --local-prefix /scratch/user/shared_cache - 临时调整存储验证级别(生产环境谨慎使用):
snakemake --profile <profile> --keep-storage-local-copies --storage-verify none --sdm conda --configfile config/config.yml --directory /scratch/user/something
- 手动预下载
4. 并行调度触发请求过载
- 原因:
work_a的wildcard规则被多个Slurm作业同时触发,短时间内大量请求触发Zenodo的429限制;work_b因文件已存在,作业直接跳过下载步骤。 - 解决:
- 在
work_a规则中限制并行度:rule work_a: input: git_a_files=expand("git_repo/a/{file}", file=checkpoint.get_a_data.output), unpacked_a_files=expand("a_unpacked/{wildcard}"), resources: slurm_jobs=1 shell: # 执行work_a逻辑 - 给Zenodo存储插件添加请求速率限制:
snakemake --profile <profile> --keep-storage-local-copies --storage-zenodo-rate-limit 1 --sdm conda --configfile config/config.yml --directory /scratch/user/something
- 在
验证步骤
- 手动预下载
a.tar.gz到共享缓存目录,运行工作流验证是否仍重复下载。 - 用
snakemake --list-output查看输出文件列表,确认checkpoint输出被正确追踪。 - 测试单节点运行工作流(关闭Slurm并行),排除集群调度导致的冲突。
内容的提问来源于stack exchange,提问作者jundskal
相关产品推荐
相关产品推荐

