golang基于DRMAA标准的集群调度作业提交插件库drmaa的使用
Golang基于DRMAA标准的集群调度作业提交插件库drmaa的使用
简介
go-drmaa是一个兼容DRMAA标准的Golang作业提交库。该库是对许多分布式资源管理器(集群调度器)提供的DRMAA C库实现的封装。
该库完全支持Open Cluster Scheduler和Gridware Cluster Scheduler。最初是使用Univa Grid Engine的libdrmaa.so开发的,并已在不同版本的Grid Engine、Torque和SLURM上进行了测试。
安装
首先下载包:
export GOPATH=${GOPATH:-~/src/go}
mkdir -p $GOPATH
go get -d github.com/dgruber/drmaa
cd $GOPATH/github.com/dgruber/drmaa
不同调度器的编译方式
Univa Grid Engine和原始SGE:
source /path/to/grid/engine/installation/default/settings.sh
./build.sh
cd examples/simplesubmit
go build
export LD_LIBRARY_PATH=$SGE_ROOT/lib/lx-amd64
./simplesubmit
Son of Grid Engine:
source /path/to/grid/engine/installation/default/settings.sh
./build.sh --sog
cd examples/simplesubmit
go build
export LD_LIBRARY_PATH=$SGE_ROOT/lib/lx-amd64
./simplesubmit
Torque:
./build.sh --torque
cd examples/simplesubmit
go build
./simplesubmit
SLURM:
./build.sh --slurm /usr/local
使用示例
基本使用
package main
import (
"fmt"
"github.com/dgruber/drmaa"
)
func main() {
// 创建DRMAA会话
s, err := drmaa.MakeSession()
if err != nil {
fmt.Printf("Error creating session: %s\n", err)
return
}
// 确保会话结束时关闭
defer s.Exit()
// 分配作业模板
jt, errJT := s.AllocateJobTemplate()
if errJT != nil {
fmt.Printf("Error during allocating a new job template: %s\n", errJT)
return
}
// 防止内存泄漏,释放分配的C作业模板
defer s.DeleteJobTemplate(&jt)
// 设置要提交的应用程序
jt.SetRemoteCommand("sleep")
// 设置参数(有多个参数时使用SetArgs())
jt.SetArg("1")
// 提交作业
jobID, errSubmit := s.RunJob(&jt)
if errSubmit != nil {
fmt.Printf("Error submitting job: %s\n", errSubmit)
return
}
fmt.Printf("Job submitted with ID: %s\n", jobID)
// 等待作业完成并获取作业信息
jinfo, errWait := s.Wait(jobID, drmaa.TimeoutWaitForever)
if errWait != nil {
fmt.Printf("Error waiting for job: %s\n", errWait)
return
}
fmt.Printf("Job finished with exit status: %d\n", jinfo.ExitStatus)
}
批量作业提交
// 提交1000个相同作业的实例
jobIDs, errBulkSubmit := s.RunBulkJobs(&jt, 1, 1000, 1)
if errBulkSubmit != nil {
fmt.Printf("Error submitting bulk jobs: %s\n", errBulkSubmit)
return
}
fmt.Printf("Submitted bulk jobs with IDs: %v\n", jobIDs)
作业控制
// 终止作业
errTerm := s.TerminateJob(jobID)
if errTerm != nil {
fmt.Printf("Error terminating job: %s\n", errTerm)
}
关键概念
-
DRMAA会话:应用程序需要先打开DRMAA会话才能执行DRMAA调用。会话关闭时必须调用Exit()方法。
-
作业模板:包含作业的规范,如要执行的命令及其参数。使用完成后需要删除以防止内存泄漏。
-
作业状态:可以通过相应方法改变作业状态(暂停/恢复/保持/删除)。
-
作业信息:JobInfo数据结构包含作业的运行时信息,如退出状态或使用的资源量。
注意事项
-
确保总是调用Exit()方法关闭会话,否则可能会在集群调度器端留下通信句柄。
-
在Go中使用defer语句管理资源释放,但注意os.Exit()调用时不会执行defer函数。
-
作业模板底层是C分配的,超出Go系统范围,必须确保不再使用时删除它。
更多关于golang基于DRMAA标准的集群调度作业提交插件库drmaa的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复