Nextflow: 기본 개념

5973 단어 groovynextflow
Nextflow enables scalable and reproducible scientific workflows using software containers. It allows the adaptation of pipelines written in the most common scripting languages.
Its fluent DSL simplifies the implementation and the deployment of complex parallel and reactive workflows on clouds and clusters.


https://www.nextflow.io/

En el artículo anterior Vimos는 Nextflow를 소개합니다. En este vamos a profundizar un poco más en los conceptos básicos de este lenguaje

관로



Podemos는 파이프라인을 정의하고 Nextflow를 현실화하기 위해 필요한 작업을 수행합니다. Básicamente es asociarlo con el fichero (y sus 포함) a ejecutar

프로세스



El proceso, process, es la unidad básica a ejecutar. Podemos asociarlo con el comando de sistema a ejecutar para completar una tarea. Dicho comando tendrá unos parametros de entrada y generará una salida.

Así mismo los procesos son independientes y no comparten un estado común sino que se comunican entre sí mediante colas(o canales)

채널



Un canal es el mecanismo por el cual los procesos se intercambian datos. Cuando definimos un proceso declaramos su input pero no especificamos de donde leer este input. Es mediante los canales (y sus operatores) donde realizamos esta interconexión o dependsencia

Flujo de trabajo



그는 "atómicas"를 unidades "atómicas"e independientes que lo único que necesitan para su ejecución es disponer de los datos de entrada que definan(y producir unos datos de salida también definidos por el propio proceso)라고 생각합니다.

Así pues, podemos pensar que al inicio de nuestro pipeline todos los procesos se encuentran creados y a la espera de "ser alimentados". Dicha alimentación se realiza a través de los diferentes operatores que ofrece un Channel:

hola.nf

process goodbye {
  input:
    path name
  output:
    stdout

    """
    cat $name
    """
}

process hi {
  input:
    val name

  output:
    path "name.txt"

    """
    echo Hi $name > name.txt
    """
}

workflow {
   Channel.of( 'Jorge' ) | hi | goodbye | view
}


En este ejemplo podemos ver dos procesos definidos (안녕히 가세요)
  • 안녕 recibe un fichero como entrada(path) y en su contexto lo vamos a referencename.
    Su ejecución va a consistir en volcar (
    cat`) dicho fichero por la consola, emitiendo la salida
  • hi por su parte recibe una cadena (val) y en su contexto la vamos a referenciar como name (작별인사 없음). Dicho proceso va a concatenar una cadena fija con el parametro de entrada para generar un fichero de trabajo name.txt y emitirá la ruta de este fichero

  • Por último definimos el flujo de trabajo:
  • Un canal emitirá una cadena fija, que será enviada al proceso hi . La salida de este será enviada por el canal al proceso goodbye y por ultimo la salida de este será volcada por consola( view )

  • Como podemos intuir, el orden de ejecución de los procesos no viene determinado por su posición en el fichero sino por la composición del flujo de trabajo. De esta manera Nextflow nos permitirá definir (y reutilizar) procesos en diferentes ficheros y componerlos a nuestro antojo

    En los siguientes artículos iremos viendo, entre otras cosas, cómo ejecutar procesos en paralelo

    집행자

    Mientras que el proceso define el comando a ejecutar, el executor es el que define cómo se ejecutará dicho comando.

    El executor por defecto es la máquina donde se está ejecutando el pipeline pero, sin modificar este, podemos indicarle a Nextflow qué executor usar como por ejemplo un cluster SLURM, un container de Amazon o de Google, etc

    Así por ejemplo, cuando le indicamos a Nextflow que un pipeline lo ejecute, por ejemplo, en AWS él se encargará de aprovisionar la instancia, esperar a que se encuentre lista y ejecutar el script en esta (en realidad usando las APIs del executor en concreto)

    프로그램

    La idea principal de Nextflow es que con la sintaxis que ofrece se disponga prácticamente de todas las herramientas para definir pipelines complejos, pero aun así permite incluir scripts con toda la complejidad que se desee.

    Al estar desarrollado en Groovy es posible incluir scripts en el propio pipeline que nos ayuden a ampliar el lenguaje. Así mismo permite la inclusión de librerías Java (jar) simplemente colocándolas en la carpeta lib
    random.nf
    `
    def cadenaRandom(){
    new Random().with {(1..9).collect {(('a'..'z')).join()[nextInt((('a'..'z')).join().length())]}.join()}
    }

    process hi {
    input:
    val name

    output:
    stdout

    """
    echo $name is a random string
    """
    

    }

    workflow {
    Channel.of( cadenaRandom() ) | hi | view
    }

    nextflow run ./random.nf
    N E X T F L O W ~ version 22.04.5
    Launching ./dos.nf [friendly_fourier] DSL2 - 개정판: d0b1349f31
    실행자 > 로컬(1)
    [65/ee7786] 프로세스 > hi (1) [100%] 1 of 1 ✔
    lswwkzafv는 임의의 문자열입니다.
    `

    결론

    En este artículo hemos visto las piezas básicas que componen un flujo de trabajo así como una breve introducción a la definición y ejecución de los procesos

    좋은 웹페이지 즐겨찾기