设置log_directory后SLURMCluster Worker日志文件内容异常排查
解决SLURMCluster日志全写入.err文件、.out为空的问题
问题场景
原本SLURM Worker日志格式为:
./slurm-<id>.out ...
为将日志统一存入独立目录,配置了log_directory参数:
from dask_jobqueue import SLURMCluster c = SLURMCluster(queue_name, log_directory="dirA") c.scale_up(1)
配置后生成./dirA/dask-worker-<id>.out和./dirA/dask-worker-<id>.err,但所有日志内容都写入.err文件,.out文件始终为空,需要实现.out存常规日志、.err存错误信息的分离。
解决方案
问题根源是默认的SLURM作业脚本未正确分离标准输出(stdout)和标准错误(stderr),可通过以下两种方式修复:
方式1:显式指定stdout和stderr参数
初始化SLURMCluster时,直接指定stdout和stderr的文件名模板,结合log_directory实现路径拼接:
from dask_jobqueue import SLURMCluster c = SLURMCluster( queue_name, log_directory="dirA", stdout="dask-worker-%j.out", stderr="dask-worker-%j.err" ) c.scale_up(1)
其中%j是SLURM的作业ID占位符,会自动替换为实际Worker的作业ID,最终日志路径即为dirA/dask-worker-<id>.out和dirA/dask-worker-<id>.err。
方式2:自定义作业脚本模板
如果默认参数无法满足需求,可直接自定义SLURM作业脚本模板,明确通过#SBATCH -o和#SBATCH -e指令分离输出:
# 自定义作业脚本模板 job_template = """#!/bin/bash #SBATCH -J dask-worker #SBATCH -n {ncpus} #SBATCH -q {queue} #SBATCH -o {log_directory}/dask-worker-%j.out #SBATCH -e {log_directory}/dask-worker-%j.err {job_script_prologue} exec dask-worker {scheduler_address} --nthreads {nthreads} --nprocs {nprocs} --memory-limit {memory_limit} --name {name} --nanny {nanny} --death-timeout {death_timeout} """ # 初始化集群时传入模板 c = SLURMCluster( queue_name, log_directory="dirA", job_script_template=job_template ) c.scale_up(1)
这种方式完全控制作业脚本的生成逻辑,确保stdout和stderr分别写入对应文件。
内容的提问来源于stack exchange,提问作者michaelgbj
相关产品推荐
相关产品推荐

