跳转至

多瑙作业调度系统

命令行

参考 https://support.huawei.com/enterprise/zh/doc/EDOC1100347973/6862ba9a?idPath=23710424|251364417|9856629|262279633|253585671

Warning

第一次使用多瑙调度器之前需要执行 dlogin ,输入用户密码后获取用户token。

作业提交

dsub

命令行提交作业

dsub -n 'jobname'  -q 'QueueName' -R 'cpu=4'  -o jobname_%J.out  sleep 100

脚本提交作业

submit.sh
#!/bin/bash
#DSUB -n jobname
#DSUB -R 'cpu=2' 
#DSUB -o jobname_%J.out
date
echo "this is script job"
sleep 10
date

提交

# 作业脚本需要有可执行权限
$ chmod +x submit.sh

$ dsub -s submit.sh

-n 指定作业名称。

-R 作业申请的资源, -R 'cpu=2 申请 2 个 CPU 核。如果作业有内存需求,可以申请内存,如 #DSUB -R 'cpu=2;mem=50G'

-nl 指定作业运行的节点,如 #DSUB -nl 'agent-ARM-01';也可以指定作业运行的节点范围,#DSUB -nl 'agent-ARM-0[1-9]'

-o 指定作业日志。-o 以追加的方式写入,-oo 以覆盖的方式写入。日志文件名可以使用特殊变量: %U 表示 userName%J 表示 JobID%G 表示 TaskGroupName%I 表示 Index%A 表示 UserName_JobID_TaskGroupName_Index

dsub -w 提交阻塞式作业,提交作业并等待作业结束,用于写分析流程,与 lsf -K 作用相同。

资源标签:集群有多种硬件资源,arm 节点、x86 节点、ai 节点以及胖节点,集群上使用不同的资源标签代表不同类型的节点,以方便作业提交到对应类型的节点运行,可以使用 dadmin label show 查看资源标签及对应的节点。

$ dadmin label show
NAME             TYPE             NODES                                                           
AI               exclusive        AI-01                                                           
aarch64          shared           AI-01,agent-ARM-[01-43],fat-agent-ARM-[01-03]                   
arm              shared           agent-ARM-[01-43]                                               
fat_arm          exclusive        fat-agent-ARM-[01-03]                                           
fat_x86          exclusive        fat-agent-X86-[01-03]                                           
x86              shared           agent-X86-[01-58]                                               
x86_64           shared           agent-X86-[01-58],fat-agent-X86-[01-03]    

在 arm 登录节点提交的作业默认提交到资源标签为 arm 的节点,如果想提交到 x86 节点,可使用 --label x86 指定使用 x86 标签,同时需要加上 -aa 选项,如下所示。使用其它类型的节点,指定对应的资源标签即可。

提交作业到 x86 节点。

submit.sh
#!/bin/bash
#DSUB -n x86_job
#DSUB -R 'cpu=2' 
#DSUB -aa
#DSUB --label x86
#DSUB -o x86_job_%J.out
date
echo "this is script job"
sleep 10
date

提交作业到 x86 的胖节点。

#!/bin/bash
#DSUB -n fat_job
#DSUB -R 'cpu=2' 
#DSUB -aa
#DSUB --label fat_x86
#DSUB -o fat_job_%J.out
date
echo "this is script job"
sleep 10
date

交互作业

使用 -I 选项可以提交交互作业,用于程序调试等。

$ dsub -q interactive -I bash

交互模式进入 AI 节点。

$ dsub -q interactive --label AI   -I bash

MPI 并行作业

提交MPI跨节点并行作业时,需要使用 --mpi 选项指定支持的MPI类型,支持 openmpiintelmpihmpimpich

这里以 lammps 为例。

lammps_arm.dsu
#DSUB -n lammps
#DSUB -N 256
#DSUB --nn 2
#DSUB --mpi hmpi
#DSUB -o lammps_arm_%J.out

module load arm/lammps/29Aug2024_hmpi

# 以下三行打印hostfile文件,用于debug,正常运行可以不需要
echo $CCS_MPI_OPTIONS
hostfile=$(echo $CCS_MPI_OPTIONS| sed s'/-hostfile //g')
cat $hostfile


mpirun $CCS_MPI_OPTIONS -x OMP_NUM_THREADS=1 lmp_mpi -in in.lj
in.lj 内容
# 3d Lennard-Jones melt

variable     x index 4
variable     y index 4
variable     z index 4

variable     xx equal 20*$x
variable     yy equal 20*$y
variable     zz equal 20*$z

units                lj
atom_style   atomic

lattice              fcc 0.8442
region               box block 0 ${xx} 0 ${yy} 0 ${zz}
create_box   1 box
create_atoms 1 box
mass         1 1.0

velocity     all create 1.44 87287 loop geom

pair_style   lj/cut 2.5
pair_coeff   1 1 1.0 1.0 2.5

neighbor     0.3 bin
neigh_modify delay 0 every 20 check no

fix          1 all nve

run          10000

批量作业提交

一般用于使用同一个应用程序处理多个数据样本、或运行不同参数的场景,以提高作业提交效率、避免手工提交失误。

for sample in /share/home/username/work/lsf_bwait/raw_data/*_R1.fastq.gz;do

    index=$(basename $sample |sed 's/_R1.fastq.gz//')
    prefix=$(dirname $sample)
    dsub -n "bwa_${prefix}" --label arm  -R 'cpu=40'  -o bwa_${prefix}_%J.out "module load arm/bwa/0.7.18 arm/samtools/1.21;bwa mem -t 40 -R "@RG\tID:${prefix}\tPL:illumina\tLB:library\tSM:humen146" hg38.fa ${prefix}_R1.fastq.gz ${prefix}_R2.fastq.gz |samtools sort -@ 40 -o ${prefix}_srt.bam"

作业依赖

用于提交作业时,指定作业间的依赖关系,当被依赖的作业达成约定的状态后依赖的作业将会被调度。

dsub -D "key=value"

  • 输入的参数值必须满足 key=value 格式。key 支持 jobidJobNamevalue 值只能是 STARTEDRUNNINGSUCCEEDEDFAILEDENDED,如 '2=ENDED'

    • STARTED 表示 RUNNINGSTOPPEDSSTOPPEDSUCCEEDEDFAILED
    • ENDED 表示 SUCCEEDEDFAILED
  • jobid约束如下:

    • 必须满足jobid的限制条件,即1~12位正整数。
    • 支持指定同一个jobid的多种状态,但指定同一作业的不同状态为与逻辑时,将导致依赖无法达成。
  • JobName约束如下:

    • 若包含特殊字符 %=()|,需要使用 \ 对特殊字符进行转义。
    • 支持使用通配符(*)模糊查询,可放置开头、中间或结尾,分别对应的匹配方式为后缀匹配、关键字匹配和前缀匹配。
    • 只能依赖本用户提交的作业。
  • 多个匹配条件组合时,支持多匹配条件间的 “与(&&)/或(||)” 逻辑,且支持以分号表示与逻辑,分号和逻辑符(&&、||)不支持混用。

  • 不加单引号的纯数字按 jobid 处理;加单引号的纯数字按 JobName 处理。

使用举例:

  • 示例一:

    按照jobid指定单个作业依赖关系

    dsub -D "1=RUNNING" "echo 'hello world'"

    显示如下:

    Submit job <2> successfully.

  • 示例二:

    按照JobName指定依赖关系

    dsub -D "job1=RUNNING" "echo 'hello world'"

    显示如下:

    Submit job <3> successfully.

  • 示例三:

    按照jobid指定多个作业依赖关系

    dsub -D "(1=RUNNING||2=SUCCEEDED)&&3=ENDED" "echo 'hello world'"

    显示如下:

    Submit job <4> successfully.

  • 示例四:

    按照JobName指定依赖关系(支持通配符*)

    dsub -D "job_*=SUCCEEDED" "echo 'hello world'"

    显示如下:

    Submit job <5> successfully.

  • 示例五:

    指定JobName包含特殊字符(特殊字符需要转义)

    dsub -D "job\(202306\)=SUCCEEDED" "echo 'hello world'"

    显示如下:

    Submit job <6> successfully.

  • 示例六:

    指定纯数字的JobName

    dsub -D "'12'=RUNNING" "echo 'hello world'"

    显示如下:

    Submit job <7> successfully.

dsub 命令详细选项

  • --prehook

--prehook 用于提交作业时指定 preHook 的执行命令,preHook 是为作业执行前进行准备工作。

  • --posthook

--posthook 用于提交作业时,指定 postHook 的执行命令,postHook 是为作业执行后进行收尾工作。

  • -n | --name

    提交作业时,指定作业的名称。

  • -A | --account

    提交作业时,提交作业到指定Account下。

  • -q | --queue

    提交作业时,提交作业到指定队列下。

  • -N | --replica

    提交作业时,指定作业的任务副本数量。

  • -R | --resource

    提交作业时,指定作业的资源需求。

  • -mR | --min-resource

    提交作业时,指定作业的最小资源需求。

  • --mpi

    提交MPI作业时,指定作业的类型,Donau Scheduler会根据指定的作业类型来调度执行MPI作业。

  • -rpn | --replica-per-node

    提交MPI作业时,指定作业在每个节点运行的最大任务数。

  • -nn | --nnodes

    提交MPI作业时,指定作业运行的节点数。

  • -nl | --node-list

    提交作业时,指定节点或资源池偏好。

    • 支持表达式[]和!,[]表示范围,!表示排除。若包含!,则整体必须使用单引号引起来。

    • 支持关键字others,表示可优先运行在指定的节点或资源池上,若指定的节点或资源池不满足,则可以运行在其他节点。

  • --label

    提交作业时,指定标签,Donau Scheduler会根据指定标签来分配任务在指定主机节点上运行。

  • -o | --output -oo | --output-override

    提交作业时,重定向该作业的标准输出日志路径。-o 以追加写入的方式,-oo 以覆盖写入的方式。

    绝对路径支持使用 %U 表示 userName%J 表示JobID%G 表示 TaskGroupName%I 表示 Index%A 表示UserName_JobID_TaskGroupName_Index

  • -e | --error -eo | --errlog-overide

    提交作业时,重定向该作业的错误输出日志路径。-e 以追加写入的方式,-eo 以覆盖写入的方式。

    绝对路径支持使用 %U 表示 userName%J 表示 JobID%G 表示TaskGroupName%I 表示 Index%A 表示UserName_JobID_TaskGroupName_Index

  • -s | --script

    提交作业时,以脚本方式提交作业。

  • --topology

    提交作业时,指定作业调度的网络拓扑信息。

  • -jr | --job-requeue

    提交作业时,指定作业重排队次数和退出码范围。

  • --container

    提交作业时,指定作业运行的容器。

  • --array

    提交一个数组作业,并指定数组的大小。

  • -ar | --adv-reservation

    提交作业时,指定需要使用的预约。

  • -h | --help

    用于指导 dsub 各个命令的使用规则以及具体功能,返回支持的参数信息。

查看作业

提交作业后,查看作业运行状态:djobdjob jobid

$ djob
ID           NAME         STATE      USER         ACCOUNT      QUEUE        START_TIME           END_TIME             EXEC_NODES           
9            gatk         RUNNING    usrename       default      default      2024/10/09 08:49:52  -                    agent-ARM-15 
各字段意义:
字段含义
ID作业ID
NAME作业名称,若未指定作业名称,则默认为default。
STATE作业状态,包含WAITING、PENDING、RUNNING、STOPPED、SSTOPPED、FAILED、SUCCEEDED。
USER提交该作业的用户名。
ACCOUNT作业所在组织帐户。若未指定组织帐户提交或该用户未配置defaultAccount,则默认提交至default。
QUEUE作业所在队列。若未指定队列提交或该用户未配置 defaultQueue,则默认提交至default。
START_TIME作业开始时间。
END_TIME作业结束时间。
EXEC_NODES作业执行节点。

作业状态:

  • WAITING:调度器接收用户提交的作业,作业的初始状态是WAITING,等待调度器调度作业。

  • RUNNING:调度作业后,其状态产生两种变化:如果计算资源分配成功,作业标识为RUNNING,并分发到执行节点运行;

  • PENDING:如果资源未分配成功,作业标识为PENDING,调度器将作业挂起,并发布具体原因。使用 djob -l 查看作业的调度详情,了解挂起原因。

  • SUCCEED:如果作业正确执行完成,标识为SUCCEED。通过查看作业输出数据了解业务计算结果。

  • FAILED:如果执行失败,标识为FAILED。使用 djob -l 查看作业的运行时详情,了解失败原因。

为方便查看作业的CPU时间、内存消耗,可以改写 djob 的输出,将下面这行 alias 命令写入 ~/.bashrc 中。

alias dbs="djob --output 'jobId:8 name:8 user:8 state:8 queue:8 startTime:20 execNodes:15 totalMaxMem:15 totalUtime:15 totalStime:15'"
查看作业
$ dbs 
jobId    name     user     state    queue    startTime            execNodes       totalMaxMem     totalUtime      totalStime     
13       gatk     liuhao   RUNNING  default  2024/10/09 11:28:57  agent-ARM-15    151168          156416          2560           

djob 其它选项:

功能命令
按jobid查询djob 1
按jobid批量查询djob 1 2
宽格式显示djob -w 1
长格式显示djob -l 1
JSON格式显示djob -J 1
自定义字段查询djob --output "jobid user state" 1
自定义字段查询并指定列宽djob --output "jobid:15 user:15 state:15" 1
自定义字段查询并指定分隔符djob --output "jobid user state delimiter='%'" 1
分页查询djob -p 1 -ps 10
按作业名称模糊查询djob -n xxx
按用户查询djob -u test
按用户组查询djob -ug usergroup
按队列查询djob -q q1
按组织账户查询djob -A users
按作业状态查询djob -s FAILED,查询失败的作业;djob -s RUNNING,查询正在运行的作业
按提交时间段查询djob -t submit -st '2019/10/28 9:30:00' -et '2019/10/28 21:19:00'
按开始时间段查询djob -t start -st '2019/10/28 9:30:00' -et '2019/10/28 21:19:00'
按结束时间段查询(只能查询出完成态作业,且必须配合状态过滤选项使用,如-s、-D)djob -t end -st '2019/10/28 9:30:00' -et '2019/10/28 21:19:00'
组合查询djob -u all -s SUCCEEDED -p 1 -ps 2
查询本用户提交的未完成的作业djob
查询本用户提交的已完成的作业djob -D
查询本用户提交的所有状态的作业djob -s all
查询所有用户提交的未完成的作业(管理员身份执行)djob -u all
查询所有用户提交的已完成的作业(管理员身份执行)djob -D -u all
查询所有用户提交的所有状态的作业(管理员身份执行)

查看作业日志

dpeek

终止作业

dkill jobid 终止作业

dkill --force jobid 强制终止作业

作业控制

djctl stop JobID 挂起作业

djctl resume JobID 恢复作业

djctl requeue JobID 重启作业

djctl resubmit JobID 重新提交作业

修改作业资源

dmod

资源查看

dnode 查看所有可用的节点及每个节点的状态、CPU、内存等资源;

状态状态说明
OK节点正常,允许关闭节点。
CLOSE_ADMIN节点被管理员关闭,无法接收作业下发任务,允许开启节点。
CLOSE_LOCK节点上作业批量失败,被隔离,需要管理员手动开启。
CLOSE_BUSY节点繁忙,资源使用达到阈值,停止下发新作业,阈值下降后恢复为OK状态。
CLOSE_FAULT节点局部故障,通信、网卡、磁盘等异常,停止下发新作业需要管理员检查处理,检测到故障解除后恢复为OK。
UNAVAILABLE节点无法连接,或出现严重故障(共享存储故障/所有CX网卡掉线等),长期未收到节点心跳,无法接收作业下发任务,允许开启/关闭/删除节点,但是节点状态不发生变化。
REGISTERING节点注册中,无法接收作业下发任务,不允许开启/关闭/删除节点。
UNLICENSED在线下场景,表示系统中没有可用License文件、License文件中无计算节点资源项(CCSU-00-E01R/CCSU-00-E02R)或License文件中计算节点资源项(CCSU-00-E01R/CCSU-00-E02R)数量不足。
SUSPENDED_ADMIN管理员手动休眠节点,无法接收作业下发任务,不允许开启/关闭/删除节点。
SUSPENDED_AUTO节点自动进入休眠状态,可以接收作业下发任务,不允许开启/关闭/删除节点。
CLOSE_EXIT节点即将删除状态。无法接收作业下发任务,但是正在运行的作业不受影响。该节点上的所有作业运行完成后,会自动被删除。该状态的节点仅支持强制删除操作,此时节点上的作业会被终止。
CLOSE_FULLCPU核数和GPU卡数全部分配完毕,停止下发新作业,资源释放后恢复为OK。

dqueue 查看集群可用的作业队列

资源标签

$ dadmin label show
NAME             TYPE             NODES                                                           
AI               shared           AI-01                                                           
aarch64          shared           AI-01,agent-ARM-[01-43],fat-agent-ARM-[01-03]                   
arm              shared           agent-ARM-[01-38]                                               
fat_arm          exclusive        fat-agent-ARM-[01-03]                                           
x86              shared           agent-X86-[01-07]                                               
x86_64           shared           agent-X86-[01-58],fat-agent-X86-[01-03]     

其它

drun 使用不同的作业步骤(Job Step)提交不同的任务

dattach 用于支持用户直接连接作业执行节点或Docker容器

drespool 用于显示资源池信息

dacct 显示组织帐户作业统计和资源等信息

duser 用于显示用户作业统计等信息

dcluster 用于显示集群中节点、作业及队列等信息

本文阅读量  次
本站总访问量  次