1 基本概念

Nextflow是一个反应式工作流框架和一个编程DSL ,可简化数据密集型计算管道的编写。

它是基于Linux平台是数据科学的通用语言这一思想而设计的。Linux提供了许多简单但功能强大的命令行和脚本工具,将它们链接在一起时,便可以简化复杂的数据操作。

Nextflow扩展了这种方法,增加了基于数据流编程模型定义复杂程序交互和高级并行计算环境的能力。

2 Processes (进程)和 channels (通道)

在实践中,通过将不同的进程结合在一起来制作Nextflow管道脚本。可以用Linux平台可以执行的任何脚本语言(Bash,Perl,Ruby,Python等)编写每个进程。

进程是独立执行的并且彼此隔离,即它们不共享公共(可写)状态。他们唯一可以通信的方法是通过异步FIFO队列,在Nextflow中称为通道

任何进程都可以将一个或多个通道定义为输入和输出。这些进程之间的交互以及最终的管道执行流本身,都是由这些输入和输出声明隐式定义的。

Nextflow脚本如下所示:

// 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的输出,然后在通道具有内容时进行反应式运行。

3 执行抽象

虽然流程定义必须执行什么命令或脚本,但执行程序确定脚本在目标系统上的实际运行方式。

如果未另行指定,则在本地计算机上执行处理。本地执行程序对于管道开发和测试目的非常有用,但是对于现实世界的计算管道,通常需要HPC或云平台。

换句话说,Nextflow在管道的功能逻辑和底层执行系统之间提供了一种抽象。因此,只需在配置文件中定义目标执行平台,就可以一次编写管道并在您的计算机,网格平台或云上无缝运行它,而无需对其进行修改。

支持以下批处理调度程序:

  • Open grid engine
  • Univa grid engine
  • Platform LSF
  • Linux SLURM
  • PBS Works
  • Torque
  • HTCondor

4 脚本语言

Nextflow被设计为具有最小的学习曲线,而无需学习新的编程语言。在大多数情况下,用户可以利用他们当前的技能来开发Nextflow工作流。但是,它也提供了功能强大的脚本DSL。

Nextflow脚本是Groovy编程语言的扩展,而后者又是Java编程语言的超集。Groovy可以被视为Java的Python,因为它简化了代码编写,并且更加易于使用。

阅读Nextflow脚本部分,以了解Nextflow脚本语言。

5 配置选项

管道配置属性nextflow.config在管道执行目录中命名的文件中定义。

该文件可用于定义要使用的执行程序,流程的环境变量,管道参数等。

基本配置文件可能如下所示:

process {
  executor='sge'
  queue = 'cn-el6'
}