Basic concepts
Nextflow 是一种反应式工作流框架和一种编程DSL,可简化数据密集型计算管道的编写。
它的设计理念是,Linux平台是数据科学的通用语。Linux提供了许多简单但功能强大的命令行和脚本工具,当链接在一起时,可以方便地进行复杂的数据操作。
Nextflow扩展了这种方法,添加了定义复杂程序交互和基于数据流编程模型的高级并行计算环境的能力。
Processes and channels
在实践中,Nextflow管道脚本是通过连接不同的进程来创建的。每个进程都可以用任何可以在Linux平台上执行的脚本语言编写(Bash、Perl、Ruby、Python等)。
进程是独立执行的,并且彼此隔离,也就是说,它们不共享共同的(可写的)状态。它们通信的唯一方式是通过异步FIFO队列,在Nextflow中称为channels。
(FIFO是先入先出的意思,即谁先进入队列,谁先出去)
任何进程都可以定义一个或多个通道作为输入和输出。 这些进程之间的交互,以及最终管道执行流程本身,是由这些输入和输出声明隐式定义的。
举个例子,如下脚本(仅理解用):
// Script parameters
params.query = "/some/data/sample.fa"
params.db = "/some/path/pdb"
db = file(params.db)
query_ch = Channel.fromPath(params.query)
process blastSearch {
input:
file query from query_ch
output:
file "top_hits.txt" into top_hits_ch
"""
blastp -db $db -query $query -outfmt 6 > blast_result
cat blast_result | head -n 10 | cut -f 2 > top_hits.txt
"""
}
process extractTopHits {
input:
file top_hits from top_hits_ch
output:
file "sequences.txt" into sequences_ch
"""
blastdbcmd -db $db -entry_batch $top_hits > sequences.txt
"""
}
上面的例子定义了两个进程。 它们的执行顺序不是由blastSearch进程在脚本中出现在extractTopHits 之前的事实决定的(也可以反过来写)。
相反,由于第一个进程在其输出声明中定义了通道 top_hits_ch,而进程 extractTopHits 在其输入声明中定义了通道,因此建立了通信链接。
这种通过通道的链接意味着extractTopHits 正在等待blastSearch 的输出,然后在通道有内容时反应性地运行。
请阅读 Channel 和 Process 部分以了解有关这些特性的更多信息。
Execution abstraction
虽然进程定义了必须执行的命令或脚本,但执行器确定该脚本在目标系统上实际运行的方式。
如果没有另外指定,进程将在本地计算机上执行。 本地执行器对于管道开发和测试目的非常有用,但对于现实世界的计算管道,通常需要 HPC 或云平台。换句话说,Nextflow 提供了管道功能逻辑和底层执行系统之间的抽象。 因此,只需在配置文件中定义目标执行平台,就可以编写一次管道并在您的计算机、网格平台或云上无缝运行它,而无需修改它。
支持以下批处理调度程序:
支持以下云平台:
请阅读Executors以了解有关Nextflow执行器的更多信息。
Scripting language
Nextflow被设计为具有最小的学习曲线,不需要学习新的编程语言。在大多数情况下,用户可以利用他们目前的技能来开发Nextflow工作流程。但是,它也提供了一个强大的脚本DSL(domain-specific language)。
Nextflow脚本是Groovy编程语言的扩展,而Groovy又是Java编程语言的超集。Groovy可以被看作是Java的Python,因为它简化了代码的编写,而且更容易掌握。
Configuration options
管道配置属性在管道执行目录中名为nextflow.config的文件中定义。
一个基本的配置文件看起来像这样:
process {
executor='sge'
queue = 'cn-el6'
}
请阅读Configuration部分以了解有关Nextflow配置文件和设置的更多信息。