搭建流程时,我们把各个模块脚本都写好了,现在通过编写主程序将模块串起来,那么怎么样依次(或者并行)将任务自动投递到集群呢?就是说这一步运行完之后,下一步自动运行。我们当然可以在脚本中设一个标志,反复检查这一个标志是否出现来决定是否运行下一步,但这种方法太原始,太多弊端了,耗内存,无法并行,且不可预料的出错。那么,有没有相应的工具来管理集群任务投递?有,python的drmaa包可以实现。
1. drmaa简介
Distributed Resource Management Application API (DRMAA),即分布式资源管理应用程序API,是一种高级 开放网格论坛(Open_Grid_Forum)应用程序接口规范,用于向分布式资源管理(DRM)系统(例如集群或网格计算提交和控制作业)。API的范围涵盖了应用程序提交,控制和监视DRM系统中执行资源上的作业所需的所有高级功能。DRMAA API已在Sun的Grid Engine(SGE)和Condor等作业管理调度系统中实现。关于SGE可参考我的推文:集群SGE作业调度系统
C、C++、Perl、Python等程序语言都开发有相应的drmaa包来实现SGE集群的任务管理。这里记录下drmaa-python:
Github:drmaa-python
PyPi:https://pypi.org/project/drmaa/
2. 安装和配置
要求:Python2.7+;与DRMAA兼容的集群,如SGE。
#安装
pip install drmaa
#设置路径
export SGE_ROOT=/path/to/gridengine #SGE安装的路径
export SGE_CELL=default
#设置库
export DRMAA_LIBRARY_PATH=/usr/lib/libdrmaa.so.1.0
#libdrmaa.so.1.0 C动态库,是libdrmaa-dev包的一部分
3. 示例
3.1 开始和终止会话
Session
#!/usr/bin/env python
import drmaa
def main():
"""Create a drmaa session and exit"""
with drmaa.Session() as s: #自动初始化,组织工作提交
print('A session was started successfully')
#with结束自动exit(),大部分函数都要在exit()前执行,如runJob/wait,getContact可在exit()后。
if __name__=='__main__':
main()
使用可重新连接的会话,可以将DRMAA库初始化为上一个会话,从而允许该库访问该会话的作业列表.
#!/usr/bin/env python
import drmaa
def main():
"""
Create a session, show that each session has an ID, use session ID to
disconnect, then reconnect. Finally, exit.
"""
s = drmaa.Session()
s.initialize()
print('A session was started successfully')
response = s.contact
print('session contact returns: %s' % response)
s.exit()
print('Exited from session')
s.initialize(response) #初始化上个session
print('Session was restarted successfullly')
s.exit()