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方法应该遵循如下规则:
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))
在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