JH Unischeduler
景行资源管理与调度软件(JH Unischeduler)作为一款支持多种类型的应用软件的通用中间件集成应用,其作用范围涵盖机械行业设计软件、制造业CAD/CAE设计软件、石油勘探分析软件、模拟仿真软件、科学计算软件和大数据分析软件等。这些不同类型的应用软件可以同时被集成到由景行资源管理与调度软件管理的计算集群中,从而实现了多领域、多学科和多类型应用资源的充分共享。
为了使有限的资源得到高效和充分的利用,景行资源管理与调度软件内置了多种高效的调度管理策略,包括先来先服务、用户/用户组资源配额管理、基于队列的优先级设置、资源公平共享调度、独占式作业调度、抢占式作业调度等。
景行资源管理与调度软件基于以上调度策略,会将各类应用软件的每次执行实例作为一个作业来进行调度和管理,并为管理员和用户提供更为方便的作业状态监控和友好的使用界面。
景行资源管理与调度软件作为云计算基础架构产品的支柱,与以此为基石的景行应用门户软件、景行安全控制软件等,均是以安全可靠,体验至上为原则服务用户,通过与景行资源分析软件的集成,可以为用户呈现详细的资源使用情况、灵活的作业调度和统计分析报表功能。
景行资源管理与调度软件是一款完全自主研发的云计算资源管理调度程序。它使用jhds模块收集系统和作业进程的资源使用信息,并使用jobagent、jobexecutor和scheduler模块实际控制和执行作业。
在此基础上,景行资源管理与调度软件扩展了资源管理模块,并创建了多个云计算资源的负载探测器来检测节点资源负载情况,景行资源管理与调度软件拥有统一的调度模块以实现先进的作业管理调度策略,如公平共享调度策略、抢占式作业调度策略和独占式作业调度策略等,同时还提供了资源和许可证的管理与调度。这些模块是完全独立运行的系统进程。
云计算资源管理: 景行资源管理与调度软件能够将网络上多台异构类型的计算机资源整合为一个集群应用服务平台。应用程序资源的调用不再只局限于个人工作站,也不需要为了满足个性化的资源需求而手动修改应用程序,只需要编辑一些简单的应用脚本和命令就能够使用平台上的计算资源。景行资源管理与调度软件还可以根据节点的负载条件和应用程序的资源需求,从整个集群应用服务平台中选择最合适的计算节点。
执行作业: 对于景行资源管理与调度软件管理的应用服务系统而言,远程和本机执行作业的行为是一致的,即使是最复杂的终端交互控制作业,也如同是在本机执行。当作业获得所需要的软硬件资源,或当应用服务平台的系统负载较轻时,景行资源管理与调度软件会根据预定的策略自动执行作业,并可以根据资源负载情况,完全控制作业。如:挂起作业和恢复作业运行。景行资源管理与调度软件能够以交互式作业或批处理作业的形式执行串行或并行的应用程序。当作业在一组资源负载较轻或空闲的资源节点上执行时,执行效率会大幅提高。
管理应用: 对于由景行资源管理与调度软件管理的应用服务系统,用户可以远程运行本地工作站上没有的,甚至因为本地工作站配置低而无法完成安装或运行的大型应用软件,例如:CAD、CAE和CFD等大型应用软件。用户的作业实际是运行在集群后台的高端服务器上,其执行过程和结果完全透明地展现在用户的桌面机上。
控制系统资源的访问: 系统管理员可以轻松地控制应用服务系统中资源的使用,例如:
资源和作业记账: 景行资源管理与调度软件提供了资源和作业记账的机制。这些信息可以帮助管理员分析资源的使用情况和作业的执行情况,以及系统在一天或者一周内的负载情况,同时帮助管理员确定是否有资源过载情况发生,为合理化系统配置或扩展和升级系统提供详尽的数据支持。
作业记账: 记录了作业运行的大量信息,所有这些数据都被存储在一个作业记账文件中。如:
应用: 绝大多数的应用都可以通过景行资源管理与调度软件的接口被启用,不需要直接与之发生交互,也不需要为了使用景行资源管理与调度软件而刻意的修改程序。目前,景行资源管理与调度软件可支持大多数的Linux、CentOS或者Windows的命令和第三方应用程序。
容错: 一旦有计算资源请求,景行资源管理与调度软件会通过内置高效的调度策略寻找可用的计算资源,并保证计算资源的请求被及时的派发执行。在应用服务系统中,只要还有一台服务器在运行,景行资源管理与调度软件就能够继续接收计算资源请求。如果计算资源请求失败,则会主动把该请求重新派发到另一台可满足资源需求的服务器上执行。景行资源管理与调度软件将整个应用服务系统的状态保存在文件数据库中,只要该事务日志文件可访问,景行资源管理与调度软件就能保证执行所有的计算资源请求,并可为该事务日志文件设置镜像备份,以保证主文件服务器停止工作时,可根据镜像的事务日志文件继续执行作业的操作,为整个集群应用服务系统提供执行作业的容错能力。
异构系统的支持: 景行资源管理与调度软件是连接不同操作系统的中心枢纽,通用的架构使其能够支持多种类型的操作系统(如:Linux、CentOS和Windows),还可支持这几种操作系统之间的相互操作。
并行处理: 景行资源管理与调度软件支持MPI(Message Passing Interface)。它既是集群资源的分配者也是管理者,并可为每个并行作业寻找最佳的节点。
调度策略: 景行资源管理与调度软件提供了快速高效的调度策略,保证了受其管理的应用服务系统正常运行。用户可以根据不同的需求使用不同的策略,例如,用户可以设置队列级的公平共享调度策略,控制和管理应用资源的需求冲突。景行资源管理与调度软件还内置了许多其他队列级的调度策略,如最基本的先来先服务、抢占式和独占式策略。
资源预留: 是指对某个作业或队列强制预留资源。资源预留保证了正在运行的作业有足够的资源(通过对资源提前占位,可以很好的解决作业运行过程中因请求资源的动态变化而不够的问题)。
作业数组: 作业数组延伸了作业的概念,作业从单个输入文件、单例执行的应用程序延伸为多个并行文件、多例执行的应用程序。使用景行资源管理与调度软件的作业数组功能,可以允许用户提交单个数组作业,而该数组作业可以使用不同的数据参数来多次执行同一应用程序。
共享资源: 共享资源是指由景行资源管理与调度软件管理的集群中所有节点上的可用资源,这些资源可以在节点组之间共享。如应用软件的浮动许可证就是一个典型的可共享资源,集群中的所有节点都可以通过自动获取到的浮动许可证来执行该软件。景行资源管理与调度软件保证了在作业派发到各执行节点前获得有效的许可证后执行作业,从而使得该浮动许可证资源在各执行节点间得到合理化的应用。
并行作业的处理器预留: 在同一个景行资源管理与调度软件管理的集群中执行并行和普通应用程序时,因为普通作业只需要一个CPU而并行作业需要等待多个空闲的CPU,所以并行作业所需要的CPU会被普通作业先占用。并行作业处理器的预留功能,允许并行作业在排队期间将所需的空闲处理器(作业槽slots)预留一段时间而不被其他的普通作业使用。
Job Starter: 每一个景行资源管理与调度软件队列都可以配置一个Job Starter。Job Starter是一个可执行脚本或者是可执行程序,主要用来创建作业执行的环境。通过JobStarter,景行资源管理与调度软件管理员可以自定义作业执行的环境。例如:
可配置作业控制的方式: 可通过景行资源管理与调度软件的作业控制功能,修改作业在集群系统中的运行状态。通常情况下,作业先是进入PEND状态,然后进入RUN状态,作业执行完成后显示为DONE状态。有时会在作业的生命周期内,被系统挂起进入SSUSP状态,或者是被用户挂起而进入USUSP状态。景行资源管理与调度软件给管理员提供了配置控制作业时所触发的一系列动作,当作业状态改变时,这些自定义的触发动作将会被执行。
jsub [-h] [-V] [-x] [-H] [-I] [-IX] [-Is] [-djm]
[-L login_shell]
[-P project_name] [-R res_req] [-q queue_name]
[-app application_name]
[-m “host_name[+[pref_level]] | host_group[+[pref_level]]…”]
[-n min_processors[,max_processors]] [-J job_name] [-Jd job_desc]
[-i in_file] [-o out_file] [-e err_file]
[-E pre_exec_command[argument…]]
[-Ep post_exec_command[argument…]]
[-cwd current_working_directory]
[-gpgpu “num [type=type1,type2…] [gmem=gmemsize] [mig=gsize]”]
[-r | rn] [-M mem_limit] [-W run_limit] [-We limit]
[-hosts “num [hselect=hselect_string]”] [-port num] [-mf file]
[-aps priority] [-f [host:]local_file operator [remote_file]]
[-command command [command …]] [-command command [command…]]
$ jsub -m host1 -q short my_job
$ jsub -m "host1+2 host2+1 host3" my_job
$ jsub -R "select[((type==NTX64 && mem > 50)||(type==LINUX64&& mem> 100))]" my_job
$ jsub -R "rusage[mem=50&swap=100]" my_job
$ jsub -n 4 -R "span[hosts=1]" my_job
$ jsub -n 4 -R "span[ptile=2]" my_job
$ jsub -n 2,4 my_job
$ jsub -m ~host1 my_job
$ jsub -o ~/output.sh my_job
$ jsub -i /apps/dir_input/input.sh -o /apps/dir_output/output.log -e
/apps/dir_output/error.log -cwd /apps/dir_output "hhh;sleep 10;hostname"
$ jjobs -l 59
Job <59>, Job Name <hhh;sleep 10;hostname>, User <user1>, Project
<default>, Status <PSUSP>, Queue <normal>, Application
<default>, APS Priority <5000>, Command <hhh;sleep 10;hostname>
Thu Mar 31 17:22:43: Submitted from host <host1>, CWD
</apps/dir_output>, Input File <dir_input/input.sh>, Output File
<dir_output/output.log>, Error File <dir_output/error.log>,
Specified Hosts <host1>;
$ jsub -f '/files/abc.conf > abc.conf' -f ' /tmp/ < test.conf' 'mv
$JH_STAGE_DIR/abc.conf $JH_STAGE_DIR/test.conf'
注:$JH_STAGE_DIR 对应的值为管理门户->调度管理->高级配置功能页面表单中对应的配置项"Linux节点数据缓存目录(STAGE_TOP_DIR_LINUX)"的值(此处以/tmp/stagein为例)。
在此作业的执行节点文件系统下会按照以下规则产生作业文件临时目录:
/tmp/stagein/.${JOB_ID}.${JOB_INDEX}.stage
例如:
/tmp/stagein/.54.0.stage/xxx
jjobs [-h] [-V] [-w | -l] [-a] [-d] [-p] [-s]
[-r][-A] [-m host_name]
[-q queue_name] [-app application_name] [-u user_name | -u all]
[-P project_name] [-o “field_name[:[-][output_width]] …
[delimiter=‘character’]”] [-J name_spec] [-Jd desc_spec][-env]
[-t] [-regexp] [jobId [jobId …]]
$ jjobs -p -u user1
$ jjobs -r -m host1
$ jjobs -q short -P my_project -u all
$ jjobs -l job_id
$ jjobs -o "jobid:4 stat:-10 from_host delimiter=';'"
jhosts [-h] [-V] [-w | -l] [-R res_req] [-s
[res_name [res_name …]]]
[host_name [host_name …]] {stat,attrib,remove} …
$jhosts -l host1
$jhosts -R "select[mem>600]"
jmod [-h] [-V] [-L login_shell | -Ln] [-R res_req
| -Rn]
[-q queue_name | -qn] [-m “host_name[+[pref_level]] | host_group[+[pref_level]]…” | -mn]
[-n min_processors[,max_processors] | -nn] [-J job_name]
[-Jd job_desc | -Jdn] [-gpgpu “num [type=type1,type2…]
[gmem=gmemsize] [mig=gsize]” | -gpgpun]
[-app application_name | -appn]
[-hosts “num [hselect=hselect_string]” | -hostsn]
[-port num | -portn] [-mf file | -mfn] [-aps priority | -apsn]
[-M mem_limit | -Mn] [-W run_limit | -Wn] [-P project_name]
[jobId | jobId[index_list]] [[jobId | jobId[index_list]]…]
详细信息见 jsub 命令,注意:不能修改已经派发成功的作业的-o、-e选项的值。如果在选项后面跟一个’n’,表示重置相应的作业选项信息。
$jmod -q test1 jobID
$jmod -qn jobID
$jmod -W +50 jobID $jmod -W +00:50 jobID
$jmod -W -120 jobID$jmod -W -02:00 jobID
其他选项示例可以参考jsub进行使用。
jctrl stop [-h] [-m host_name] [-q queue_name]
[-u user_name | -u all]
[-J job_name] [-app application_name]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0 …]
jctrl resume [-h] [-m host_name] [-q
queue_name]
[-u user_name | -u all] [-J job_name]
[-app application_name]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0 …]
jctrl kill [-h] [-m host_name] [-q queue_name]
[-u user_name | -u all]
[-J job_name] [-f] [-app application_name]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0 …]
[user1@host1 apps]$ jctrl bot -p 2 241 243 242
Job <241> has been moved to position 2 from bottom
Job <243> has been moved to position 2 from bottom
Job <242> has been moved to position 2 from bottom
[user1@host1 apps]$ jjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME ORDER
237 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
238 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
239 user1 PEND normal host1 sleep 1000 Mar 30 15:40 1
241 user1 PEND normal host1 sleep 1000 Mar 30 15:40 2
243 user1 PEND normal host1 sleep 1000 Mar 30 15:40 3
242 user1 PEND normal host1 sleep 1000 Mar 30 15:40 4
240 user1 PEND normal host1 sleep 1000 Mar 30 15:40 5
[user1@host1 apps]$ jjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME ORDER
237 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
238 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
239 user1 PEND normal host1 sleep 1000 Mar 30 15:40 1
240 user1 PEND normal host1 sleep 1000 Mar 30 15:40 2
241 user1 PEND normal host1 sleep 1000 Mar 30 15:40 3
242 user1 PEND normal host1 sleep 1000 Mar 30 15:40 4
243 user1 PEND normal host1 sleep 1000 Mar 30 15:40 5
[user1@host1 apps]$ jctrl top -p 1 241 242 243
Job <241> has been moved to position 1 from top
Job <242> has been moved to position 1 from top
Job <243> has been moved to position 1 from top
[user1@host1 apps]$ jjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME SUBMIT_TIME ORDER
237 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
238 user1 RUN normal host1 host2 sleep 1000 Mar 30 15:40 -
243 user1 PEND normal host1 sleep 1000 Mar 30 15:40 1
242 user1 PEND normal host1 sleep 1000 Mar 30 15:40 2
241 user1 PEND normal host1 sleep 1000 Mar 30 15:40 3
239 user1 PEND normal host1 sleep 1000 Mar 30 15:40 4
240 user1 PEND normal host1 sleep 1000 Mar 30 15:40 5
jctrl requeue [-h] [-u user_name | -u all] [-J
job_name] [-d][-e] [-r] [-a] [-H]
0 | jobId | jobId[index] [0 | jobId | jobId[index] …]
$jctrl stop -q short -u user1 0
$jctrl resume -u user1 0
$jctrl kill -q short -u all 0
$jctrl requeue -a -u all 0
$jctrl start -m hostname jobID
$jctrl start -m "hostname1 hostname2" jobID
jctrl clean [-h] [-u user_name | -u all]
jobId | jobId[index_list] | 0 [jobId | jobId[index_list] | 0…]
$jctrl clean -u user1 0
Job <5> is being cleaned
Job <6> is being cleaned
Job <7> is being cleaned
jhist [-h] [-V] [-a] [-d] [-e] [-p] [-r] [-s] [-w
| -l]
[-S time0,time1] [-t] [-f logfile_name | -n 0] [-J job_name]
[-Jd job_desc] [-P project_name] [-q queue_name]
[-app application_name] [-u user_name|all]
[jobId | jobId[index_list] [jobId | jobId[index_list] …]]
jlimits [-h] [-V] [-s | -c] [-u
user_name|user_group|all]
[-m host_name|host_group|all] [-q queue_name|all]
[-app application_name|all] [-w]
$jlimits -u user1
$jlimits -u all
$jlimits -m host2
$jlimits -m all
$jlimits -q queue1
$jlimits -q all
$jlimits -app app1
$jlimits -app all
# jconfig list jhds.conf
cluster_domain=
host=host1
port=6322
max_connections=5
max_connections_candidate=30
timeout=5
jhds_http_port=6324
jhds_port=6325
# jconfig list jhds.conf
cluster_domain=
host=host1
port=6322
max_connections=5
max_connections_candidate=30
timeout=5
jhds_http_port=6324
jhds_port=6325
# jconfig set MASTER_CANDIDATES='host1 host2 host3'
to make the configuration effective, please run the following:
jadmin schedreconfig
jadmin jhdsreconfig
# jconfig set REDIS_PORT=9322
unischeduler stop all
unischeduler start
# jconfig update scheduler.conf CLUSTER_NAME='jhadmin user1'
to make the configuration effective, please run the following:
jadmin schedreconfig
# export LANG=zh_CN
# jcode -e 10036
10036: 许可证失败
# jcode -r 2001 2002 2006 2009
2001: Gui作业失败次数达到上限
2002: Gui作业信息读取错误
2006: Gui 作业因初始化失败而退出
2009: Gui 作业申请会话失败
$ jsub -Is bash
Job <13> is submitted to default queue <normal> and default
application <default>
<<Waiting for dispatch ...>>
<<Starting on host1>>
<< To escape to local shell, press 'Ctrl + q'. The job will keep
running at server side. >>
<< output from stdout >>
当前端jsub -Is命令终止,后端作业不退出继续运行,jjobs查询作业状态为RUN时,可通过使用命令jattach加作业ID号,attach作业到终端继续接受交互式操作。
$ jattach 13
Job <13> is running on host1
<<Waiting for attach ...>>
<<Attaching on zrkhost1>>
<< output from stdout >>
7*24小时专家团队,随时静候您的访问