跳转至

多瑙作业调度系统

命令行

参考 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

如果作业有内存需求,可以申请内存,如 #DSUB -R 'cpu=2:mem=50G'

指定作业节点范围,#DSUB -nl 'agent-ARM-0[1-9]'

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 选项,如下所示。使用其它资源池,指定对应的资源池标签即可。

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

MPI 并行作业

以 lammps 为例

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

module load arm/lammps

# 以下三行打印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 各个命令的使用规则以及具体功能,返回支持的参数信息。

查看作业

提交作业后,查看作业运行状态:djob djob 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 -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

作业控制

djctl stop JobID 挂起作业

djctl resume JobID 恢复作业

djctl requeue JobID 重启作业

djctl resubmit JobID 重新提交作业

修改作业资源

dmod

资源查看

dnode 查看所有可用的节点及每个节点的资源

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 用于显示集群中节点、作业及队列等信息

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