1 Nextflow入门

工作流(Workflows)

分析数据涉及到一系列的任务,包括收集、清洗和处理数据。这些序列被称为工作流或流水线(pipeline)。这些工作流通常需要执行多个软件,有时运行在不同的计算环境,例如台式机或计算机集群。传统上,这些工作流通过脚本连接在一起,使用通用编程语言,如 Bash 或 Python。
然而,随着工作流变得更大和更复杂,对编程逻辑和软件的管理变得困难。

工作流管理系统(Workflow management systems,WfMS)

工作流管理系统,像Snakemake、Galaxy、Nextflow,是专门为管理特定领域的计算数据分析工作流而开发的。
WfMS包含多个特性,可以简化管道的开发、监视、执行和共享。

  • 运行管理:在操作系统上对程序执行的管理,以及在一个称为并行化的过程中将任务和数据同时运行。
  • 软件管理:使用了容器技术,如Docker和Singularity,将代码及其所有依赖项打包,以便应用程序可靠地从一个计算环境运行到另一个计算环境。
  • 可移植性:在一个系统上编写的工作流可以在另一个计算基础设施上运行,如本地计算机、计算集群或云基础设施。
  • 可再现性:使用软件管理系统和管道规范意味着工作流在重新运行时将产生相同的结果,包括在不同的计算平台上。
  • 可重入性:连续检查点允许从上次成功执行的步骤恢复工作流。

Nextflow基本概念

Nextflow 是一个工作流管理系统,它结合了运行时环境、设计用于运行其他软件的软件,和简化计算管道编写的编程领域特定语言(DSL)。
Nextflow 是基于 Linux 是数据科学的通用语言这一理念构建的。Nextflow 遵循 Linux 的“松散连接的小块(small pieces loosely joined)”哲学:其中许多简单但强大的命令行和脚本工具,当链接在一起时,有助于进行更复杂的数据操作。
Nextflow 扩展了这种方法,增加了定义复杂程序交互和基于数据流编程模型的可访问并行计算环境的能力,进程通过其输出和输入连接到其他进程,并在接收到输入后立即运行。
下图说明了数据流模型和简单线性程序之间的区别。
在这里插入图片描述
在(a)中,这些语句将按顺序执行。因此,程序将在三个单位的时间内执行。在数据流编程模型(b)中,这个程序只需要两个单位的时间。这是因为读定量和 QC 步骤彼此之间没有依赖关系,因此可以并行地同时执行。

Nextflow核心特性

  1. 快速搭建原型:编写管道的简单语法,能够重用现有脚本和工具以实现快速原型化。
  2. 可再现性:Nextflow 支持多种容器技术,比如 Docker 和 Singular,以及包管理器 Conda。这允许编写独立的管道、管理版本和重现任何以前的配置。
  3. 可移植性:Nextflow 的语法将函数逻辑(工作流的步骤)与执行设置(工作流如何执行)分离开来。这允许管道在多个平台上运行,例如本地计算、计算集群或 AWS 之类的云服务,而不需要改变工作流的步骤。
  4. 简单的并行化:Nextflow 是基于数据流编程模型的,该模型极大地简化了可以同时运行的任务的分割(并行化)。
  5. 连续的检查点:自动跟踪管道执行期间生成的所有中间结果。这允许从上一个成功执行的步骤恢复其执行,不管它停止的原因是什么。

脚本语言

Nextflow 脚本旨在简化工作流编写的语言编写。为特定领域编写的语言称为领域特定语言(DSL) ,例如,SQL 用于处理数据库,AWK 用于文本处理。
实际上,Nextflow 脚本语言是 Groovy 编程语言的一个扩展,而 Groovy 又是 Java 编程语言的一个超集。Groovy 简化了代码的编写,并且比 Java 更容易使用。
在更强大的通用编程语言之上构建一个简单的 DSL 使得 Nextflow 非常灵活。Nextflow 语法可以轻松地处理大多数工作流用例,然后 Groovy 可以用来处理使用 DSL 难以实现的用例。

进程,通道和工作流(Processes, channels, and workflows)

Nextflow 工作流有三个主要部分:Processes, channels, and workflows。进程描述要运行的任务。进程脚本可以用 Linux 平台(Bash、 Perl、 Ruby、 Python 等)执行的任何脚本语言来编写。进程为每个完整的输入集生成一个任务。每个任务都是独立执行的,不能与另一个任务交互。在进程任务之间传递数据的唯一方式是通过称为通道的异步队列。
进程定义任务的输入和输出。然后使用通道来操作从一个进程到下一个进程的数据流。然后,进程之间的交互,以及最终管道执行流本身,将在工作流workflow部分中显式定义。
在下面的例子中,我们有一个包含三个元素的通道,例如,3个数据文件。我们有一个将通道作为输入的进程。由于通道有三个元素,所以该进程的三个独立实例(任务)并行运行。每个任务生成一个输出,该输出被传递到另一个通道,并用作下一个进程的输入。
flow

工作流执行

当进程定义执行的命令或脚本时,执行程序确定该脚本在目标系统中实际如何运行。
如果未另行指定,则在本地计算机上执行进程。本地执行对于管道开发、测试和小规模工作流非常有用,但是对于大规模计算管道,通常需要高性能集群(High Performance Cluster,HPC)或云平台。

Nextflow 提供了管道的功能逻辑和底层执行平台之间的分离。通过在配置文件中定义目标执行平台,这样就可以编写一次管道,然后在计算机、计算集群或云上运行它,而无需修改工作流。

Nextflow 为批处理调度器和云平台提供开箱即用的支持,例如 Sun Grid Engine、 SLURM 作业调度器、 AWS Batch 服务和 Kubernetes。

第一个脚本

现在我们来看一个示例 Nextflow 脚本,它计算文件中的行数。

#!/usr/bin/env nextflow

nextflow.enable.dsl=2

/*  Comments are uninterpreted text included with the script.
    They are useful for describing complex parts of the workflow
    or providing useful information such as workflow usage.

    Usage:
       nextflow run wc.nf --input <input_file>

    Multi-line comments start with a slash asterisk /* and finish with an asterisk slash. */
//  Single line comments start with a double slash // and finish on the same line

/*  Workflow parameters are written as params.<parameter>
    and can be initialised using the `=` operator. */
params.input = "WT_REP1_2_val_2.fq.gz"

//  The default workflow
workflow {

    //  Input data is received through channels
    input_ch = Channel.fromPath(params.input)

    /*  The script to execute is called by its process name,
        and input is provided between brackets. */
    NUM_LINES(input_ch)

    /*  Process output is accessed using the `out` channel.
        The channel operator view() is used to print
        process output to the terminal. */
    NUM_LINES.out.view()
}

/*  A Nextflow process block
    Process names are written, by convention, in uppercase.
    This convention is used to enhance workflow readability. */
process NUM_LINES {

    input:
    path read

    output:
    stdout

    script:
    /* Triple quote syntax """, Triple-single-quoted strings may span multiple lines. The content of the string can cross line boundaries without the need to split the string in several pieces and without concatenation or newline escape characters. */
    """
    printf '${read} '
    gunzip -c ${read} | wc -l
    """
}

运行程序:

nextflow run wc.nf

输出如下:

N E X T F L O W  ~  version 21.10.6
Launching `wc.nf` [extravagant_mclean] - revision: 66f51d0849
executor >  local (1)
[c2/5f5c9d] process > NUM_LINES (1) [100%] 1 of 1 ✔
WT_REP1_2_val_2.fq.gz 398264
  1. 第三行告诉你进程已在本地执行(executor > local)。
  2. 第四行显示了进程 id c2/5f5c9d、进程名称、 CPU 数量、任务完成百分比以及运行了多少个进程实例。
  3. 最后一行是view操作符的输出。

像 c2/5f5c9d这样的十六进制数表示唯一的进程执行。这些数字也是执行每个进程的目录的前缀。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值