python包Toil---跨平台工作流管理系统

简介

Toil是一个开源的纯python开发的工作流引擎

运行执行CWL工作流以及WDL工作流,允许跨平台开发测试部署

官网:  https://toil.readthedocs.io/en/latest/

环境安装

toil目前仅支持python2.7,且需要virtualenv才可以安装

如果不是集群可以如下安装

sudo pip install virtualenv
virtualenv ~/venv
source ~/venv/bin/activate
pip install toil
pip install pysam
pip install docker

集群安装

clush -a pip install toil
clush -a pip install pysam
clush -a pip install docker

运行基本工作流程

工作流程由单个作业组成。该作业的资源需求由关键字参数(内存,内核,磁盘)指定。工作流程中的原子工作单元是Job

编写Toil pipeline 首先要定义好Job,都是继承Job的抽象类,例子如下: 要定义好输入文件和输出文件,继承Job类:super(HelloWorld, self).init(*args, **kwargs);再定义好抽象方法 run,Toil会pickle这个run的方法和它的参数到一个文件,把这个文件拷贝到其他集群,需要运行到时候就load这个文件,执行对应的代码;
通常run方法应该遵循如下规则:

  1. 组装要实现的命令
  2. 定义调用docker镜像的版本
  3. 定义宿主机和Docker挂载的路径
  4. 若容器中有shell,请不要在shell里面加后台符(例如&)
  5. 如果有调用子进程,要求能够处理信号,并且杀掉子进程
  6. 运行完前,后可以进行类型检查(可选)
  7. 运行完后,删除不需要的中间文件(可选)
from toil.common import Toil
from toil.job import Job

class HelloWorld(Job):
    def __init__(self, message, *args, **kwargs):
        self.message = message
        supper(HelloWorld,self).__init__(*args, **kwargs)

    def run(self, fileStore):
        return "Hello, world!, here's a message: %s" % self.message

if __name__=="__main__":
    options = Job.Runner.getDefaultOptions("./toilWorkflowRun")
    options.logLevel = "OFF"
    options.clean = "always"

    hello_job = HelloWorld("Woot")

    with Toil(options) as toil:
        print(toil.start(hello_job))

Toil也可调用docker

在docker里执行某个py脚本,并且将disk盘映射到容器的disk目录下,dockerimage为要调用的docker image

class Hello(Job):

    def __init__(self, input, output_path, *args,
                 **kwargs):
        self.input = input
        self.output_path = output_path
        super(Hello, self).__init__(*args, **kwargs)

    def run(self, fileStore):
        commandLine = ['*.py', self.input, self.output_path]
        self.log('\t'.join(commandLine))
        volumes = {'/disk': {'bind': '/disk', 'mode': 'rw'}}
        client = docker.from_env()
        client.containers.run(
            dockerimage, '\t'.join(commandLine), volumes=volumes)

定义任务前后依赖关系

j1.addChild(j2) 表示J1运行完之后运行j2

j1.addChild(j2)  j2.addChid(j3)任务执行顺序 j1-->j2-->j3

j1.addFollowOn(j2) 表示 j1以及j1的子任务都运行完之后再运行j2

创建job对象的时候,需要设置cores, memory的大小,默认是core=1, memory=2G,  disk=2G

def pipeline(root, input, outpath, name):
    
    j1 = Hello(input,outpath,memory='8G')
    j2 = Hello(input,outpath,memory='8G')
    root.addChild(j1)
    root.addFollowOn(j2)

合并多个流程

encapsulate(): 将job及job的子任务都封装成一个job,返回值的类型也是job

A, B = A(), B()
A' = A.encapsulate()
A'.addChild(B)

toil运行完之后会生成job_store文件,可以查看每个Job类的运行时间

toil stats job_store|less -S

python包Toil---跨平台工作流管理系统_第1张图片

你可能感兴趣的:(python)