全部產品
Search
文件中心

:建立WDL工作流程

更新時間:Jun 19, 2024

WDL(Workflow Description Language)是由Broad Institute開發的一種流程開發語言,簡單易用,能夠有效提高生物資訊工作流程的構建效率。本文介紹如何通過AGS在ACK叢集上編寫並執行WDL工作流程。

前提條件

在ACK上運行WDL的優勢

  • 相容社區CromwellServer,完整相容WDL的流程定義,對遺留流程無需修改,便可以通過AGS在ACK上運行WDL流程。關於WDL的詳細介紹,請參見WDL
  • 對Task資源申請最佳化,通過Pod Guarantee QoS方式,避免資源過度爭取造成節點負載過高和效率下降。
  • 與阿里雲儲存的無縫整合,目前支援直接存取OSS和NAS,並支援多資料來源的掛載。

與AGS工作流程的區別

  • CronwellServer在以下方面仍然落後於雲原生的AGS工作流程。
    • 資源控制粒度(CPU、Mem min、Mem max)方面。
    • 調度最佳化,自動重試,資源上限的動態調整。
    • 監控、日誌等方面。
  • 在叢集資源使用水位上低於AGS,在批量樣本投遞成功率上也低於AGS工作流程。對於大批量重複性的工作流程仍然建議改造成原生的AGS工作流程來提升效率,詳細介紹請參見建立工作流程
  • 對於高CPU消耗的Mapping、HC、Mutecv2等流程可以使用AGS API來降低處理成本節省和加速。更多資訊,請參見通過AGS處理全基因組測序WGS

步驟一:部署應用

構建WDL工作流程所需的組件被打包成為一個Helm Chart,作為一個應用放在應用市場中,避免了複雜的環境配置,方便進行一鍵部署。

  1. 登入Container Service管理主控台

  2. 在控制台左側導覽列,選擇市場 > 應用市場

  3. 應用市場頁面單擊應用目錄頁簽,然後搜尋並選中ack-ags-wdl
  4. ack-ags-wdl頁面,單擊一鍵部署
  5. 建立面板中,選擇叢集和命名空間,然後單擊下一步
  6. 參數配置頁面,設定相應參數,然後單擊確定
    # PVCs to be mounted
    naspvcs:
      - naspvc1
      - naspvc2
    osspvcs:
      - osspvc1
      - osspvc2
      
    # config in transfer-pvc.yaml、storageclass.yaml
    naspvc1:
      # modify it to actual url of NAS/NFS server .
      server : "XXXXXX-fbi71.cn-beijing.nas.aliyuncs.com"
      # absolute path of your data on NAS/NFS, pls modify it to your actual path of data root
      path: "/tarTest" #eg "/tarTest"
      # strorage driver. flexVolume or csi,default is csi, if your kubernetes use flexVolume,chang it to flexVolume
      driver: "csi" # by default is csi, you could change to flexVolume for early version of K8s (<= 1.14.x)
      nasbasepath: "/ags-wdl-nas"
      # mountoptions. if you use local NFS, modify it to your mount options.
      # config in storageclass.yaml 、transfer-pvc.yaml
      mountVers: "3" #mount version-svc:
      mountOptions: "nolock,tcp,noresvport"  # mount options, for local NFS server, you could remove noresvport option
    
    naspvc2:
      # modify it to actual url of NAS/NFS server .
      server : "XXXXXXX-fbi71.cn-beijing.nas.aliyuncs.com"
      # absolute path of your data on NAS/NFS, pls modify it to your actual path of data root
      path: "/tarTest/bwatest" #eg "/tarTest"
      # strorage driver. flexVolume or csi,default is csi, if your kubernetes use flexVolume,chang it to flexVolume
      driver: "csi" # by default is csi, you could change to flexVolume for early version of K8s (<= 1.14.x)
      nasbasepath: "/ags-wdl-nas2"
      # mountoptions. if you use local NFS, modify it to your mount options.
      # config in storageclass.yaml 、transfer-pvc.yaml
      mountVers: "3" #mount version-svc:
      mountOptions: "nolock,tcp,noresvport"  # mount options, for local NFS server, you could remove noresvport option
    
    osspvc1:
      # modify it to actual bucket name
      bucket: "oss-test-tsk"
      # modify it to actual bucket url
      url: "oss-cn-beijing.aliyuncs.com"
      # mount options. It is not changed by default.
      options: "-o max_stat_cache_size=0 -o allow_other"
      akid: "XXXXXXX"
      aksecret: "XXXXXXX"
      # absolute path of your data on OSS
      path: "/"
      ossbasepath: "/ags-wdl-oss"
    
    osspvc2:
      bucket: "oss-test-tsk"
      url: "oss-cn-beijing.aliyuncs.com"
      options: "-o max_stat_cache_size=0 -o allow_other"
      akid: "XXXXXXX"
      aksecret: "XXXXXXX"
      path: "/input"
      ossbasepath: "/ags-wdl-oss-input"
    
    # Relative root path of input data and output data in your wdl.json, your path should add basepath before the relative path of the mount.
    # e.g. 
    # {
    # "wf.bwa_mem_tool.reference": "/ags-wdl/reference/subset_assembly.fa.gz",#reference filename。
    # "wf.bwa_mem_tool.reads_fq1": "/ags-wdl/fastq_sample/SRR1976948_1.fastq.gz",#fastq1 filename
    # "wf.bwa_mem_tool.reads_fq2": "/ags-wdl/fastq_sample/SRR1976948_2.fastq.gz",#fastq2 filename
    # "wf.bwa_mem_tool.outputdir": "/ags-wdl/bwatest/output", #output path,the result will output in xxxxxxxx.cn-beijing.nas.aliyuncs.com:/mydata_root/bwatest/output,you should make sure the path exists.
    # "wf.bwa_mem_tool.fastqFolder": "fastqfolder" #任務執行的工作目錄。
    # }
    
    # workdir, you can choose nasbasepath or ossbasepath as your workdir
    workdir : "/ags-wdl-oss"
    # provisiondir,you can choose nasbasepath or ossbasepath as your provisiondir. task will create a volume dynamic to input/output date.
    provisiondir: "/ags-wdl-oss-input"
    #Scheduling the task to the specified node. e.g. nodeselector: "node-type=wdl"
    nodeselector: "node-type=wdl"
    #config in cromwellserver-svc.yaml
    cromwellserversvc:
      nodeport : "32567" # cromwellserver nodeport, for internal access, you could use LB instead for external access to cromwell server.
    
    #config in config.yaml
    config:
      # project namespace. default is wdl,Generally, no change is required
      namespace: "wdl" # namespace
      #tesk backand domain name. default is tesk-api,Generally, no change is required
      teskserver: "tesk-api"
      #cromwellserver domain name,default is cromwellserver,Generally, no change is required
      cromwellserver: "cromwellserver"
      #cromwellserver port,default is 8000,Generally, no change is required
      cromwellport: "8000"
    • 配置應用儲存卷。
      應用儲存卷包括NAS和OSS。
      參數說明是否必須配置配置方法
      naspvcs需要掛載的NAS儲存卷當需要掛載的NAS儲存卷PVC為naspvc1naspvc2時,配置如下。
      naspvcs:
        - naspvc1
        - naspvc2
      osspvcs需要掛載的OSS儲存卷當需要掛載的OSS儲存卷PVC為osspvc1osspvc2時,配置如下。
      osspvcs:
        - osspvc1
        - osspvc2
    • 配置NAS儲存。
      每一個NAS儲存卷對應執行任務容器中的一個路徑nasbasepath。配置naspvcs需要為每一個NAS儲存卷進行詳細的參數配置。
      說明 其他參數配置保持預設即可。
      參數說明是否必須配置配置方法
      serverNAS IP輸入和輸出資料。需要修改為您自己NAS的url,和path。
      path掛載的子目錄
      driverFlexvolume or CSI叢集的儲存驅動,預設為CSI。當叢集使用Flexvolume時,需將該參數修改為Flexvolume。
      nasbasepathNAS目錄在應用中的映射目錄NAS目錄在應用中(命令或指令碼)的映射目錄,在後續輸入資料和輸出資料時,需要將絕對目錄中的server:path替換為nasbasepath。例如將xxx-xxx.cn-beijing.nas.aliyuncs.com:/wdl替換為/ags-wdl,輸入資料test.fq.gz在NAS中的儲存目錄為xxx-xxx.cn-beijing.nas.aliyuncs.com:/wdl/test/test.fq.gz,應用可以訪問/ags-wdl/test/test.fq.gz。本文後面均以serverxxx-xxx.cn-beijing.nas.aliyuncs.com,絕對路徑為/wdl,映射路徑nasbasepath/ags-wdl作為樣本。
      mountOptions掛載選項掛載參數。當使用您自己的NFS時,可以修改該參數進行適配。
      mountVers掛載版本
    • 配置OSS儲存。
      每一個OSS儲存卷對應執行任務容器中的一個路徑ossbasepath。配置osspvcs需要為每一個OSS儲存卷進行詳細的參數配置。
      參數說明是否必須配置配置方法
      bucketoss bucket需要修改為您自己OSS的bucket名稱和url
      urloss url
      options掛載參數預設為-o max_stat_cache_size=0 -o allow_other,不用修改。
      akidAccessKey ID您的AccessKey資訊,將會以Secret的方式部署在叢集中。
      aksecretAccessKey Secret
      path掛載的子目錄需要掛載的Bucket的子目錄。
      ossbasepathOSS目錄在應用中的映射目錄OSS目錄在應用中的映射目錄,在後續輸入資料和輸出資料時,需要將絕對目錄中的bucket:path替換為ossbasepath。例如,bucket為shenzhen-test,path/wdlossbasepath/ags-wdl,輸入資料test.fq.gz在OSS中的儲存目錄為shenzhen-test:/wdl/test/test.fq.gz。當需要填寫輸入路徑時,應填寫為/ags-wdl/test/test.fq.gz,此時應用能夠正確的訪問到輸入資料。
    • 配置其他參數。
      參數說明是否必須配置配置方法
      workdir工作目錄需要在配置的nasbasepathossbasepath中選擇一個作為工作目錄,任務運行過程中的中間檔案(script、error等)均會產生在該目錄下。
      provisiondir動態建立PV目錄需要在配置的nasbasepathossbasepath中選擇一個作為動態建立PV的目錄,任務運行過程中的輸入輸出資料均會產生在該目錄下建立的PV中。
      nodeselector任務調度支援label如果需要將任務調度到特定的label節點時,可以填寫該欄位。配置node-type=wdl會調度所有的任務到node-type=wdl的節點上。
      nodeportCromwellServer的服務暴露連接埠CromwellServer的服務暴露連接埠。當您需要用自己的Widdler用戶端提交任務時,需要用到該參數,預設為32567。
      namespace專案命名空間應用部署的命名空間,預設為wdl
      teskservertesk服務網域名稱tesk的服務網域名稱,預設無需更改。
      cromwellserverCromwellServerCromwellServer的服務網域名稱,預設無需更改。
      cromwellportCromwellServer連接埠CromwellServer的服務連接埠,預設無需更改。
    執行以下命令,返回的結果顯示cromwellclicromwellservertesk-api三個組件正常運行,說明部署成功。
    kubectl get pods -n wdl

    預期輸出:

    NAME                                READY   STATUS      RESTARTS   AGE
    cromwellcli-85cb66b98c-bv4kt        1/1     Running     0          5d5h
    cromwellserver-858cc5cc8-np2mc      1/1     Running     0          5d5h
    tesk-api-5d8676d597-wtmhc           1/1     Running     0          5d5h

步驟二:提交任務

在叢集外部可以通過AGS和命令列提交任務,推薦使用AGS提交任務。

通過AGS提交任務

新版本AGS-CLI提供了向叢集提交WDL任務的功能,您只需下載AGS,配置CromwellServer地址即可。關於如何下載AGS,請參見AGS命令列協助

  1. 建立bwa.wdl檔案和bwa.json檔案。
    • bwa.wdl檔案樣本
      task bwa_mem_tool {
        Int threads
        Int min_seed_length
        Int min_std_max_min
        String reference
        String reads_fq1
        String reads_fq2
        String outputdir
        String fastqFolder
        command {
              mkdir -p /bwa/${fastqFolder}
              cd /bwa/${fastqFolder}
              rm -rf SRR1976948*
              wget https://ags-public.oss-cn-beijing.aliyuncs.com/alignment/subset_assembly.fa.gz
              wget https://ags-public.oss-cn-beijing.aliyuncs.com/alignment/SRR1976948_1.fastq.gz
              wget  https://ags-public.oss-cn-beijing.aliyuncs.com/alignment/SRR1976948_2.fastq.gz
              gzip -c ${reference} > subset_assembly.fa
              gunzip -c ${reads_fq1} | head -800000 > SRR1976948.1
              gunzip -c ${reads_fq2} | head -800000 > SRR1976948.2
              bwa index subset_assembly.fa
              bwa aln subset_assembly.fa SRR1976948.1 > ${outputdir}/SRR1976948.1.untrimmed.sai
              bwa aln subset_assembly.fa SRR1976948.2 > ${outputdir}/SRR1976948.2.untrimmed.sai
        }
        output {
          File sam1 = "${outputdir}/SRR1976948.1.untrimmed.sai"
          File sam2 = "${outputdir}/SRR1976948.2.untrimmed.sai"
        }
        runtime {
          docker: "registry.cn-hangzhou.aliyuncs.com/plugins/wes-tools:v3"
          memory: "2GB"
          cpu: 1
        }
      }
      workflow wf {
        call bwa_mem_tool
      }
    • bwa.json檔案樣本
      {
      "wf.bwa_mem_tool.reference": "subset_assembly.fa.gz",#reference filename。
      "wf.bwa_mem_tool.reads_fq1": "SRR1976948_1.fastq.gz",#fastq1 filename
      "wf.bwa_mem_tool.reads_fq2": "SRR1976948_2.fastq.gz",#fastq2 filename
      "wf.bwa_mem_tool.outputdir": "/ags-wdl/bwatest/output", #output path,the result will output in xxx-xxx.cn-beijing.nas.aliyuncs.com:/wdl/bwatest/output,you should make sure the path exists.
      "wf.bwa_mem_tool.fastqFolder": "fastqfolder" #任務執行的工作目錄
      }
  2. 將訪問叢集中的32567連接埠的流量轉寄到Service CromwellServer上。
    kubectl port-forward svc/cromwellserver 32567:32567
  3. 執行以下命令配置CromwellServer地址。
    ags config init

    預期輸出:

    Please input your AccessKeyID
    xxxxx
    Please input your AccessKeySecret
    xxxxx
    Please input your cromwellserver url
    xxx-xxx.cn-beijing.nas.aliyuncs.com:32567
  4. 執行以下命令在本地提交WDL任務。
    ags wdl run resource/bwa.wdl resource/bwa.json --watch #watch參數可以讓該命令進行一個同步等待,直到該任務成功或失敗。

    預期輸出:

    INFO[0000] bd747360-f82c-4cd2-94e0-b549d775f1c7 Submitted
  5. 可選:您還可以在本地進行查詢、刪除WDL任務。
    • 查詢WDL任務。
      • 執行以下explain命令查詢WDL任務。
        ags wdl explain bd747360-f82c-4cd2-94e0-b549d775f1c7

        預期輸出:

        INFO[0000] bd747360-f82c-4cd2-94e0-b549d775f1c7 Running
      • 執行以下query命令查詢WDL任務。
        ags wdl query bd747360-f82c-4cd2-94e0-b549d775f1c7

        預期輸出:

        INFO[0000] bd747360-f82c-4cd2-94e0-b549d775f1c7 {"calls":{"end":"0001-01-01T00:00:00.000Z","executionStatus":null,"inputs":null,"start":"0001-01-01T00:00:00.000Z"},"end":"0001-01-01T00:00:00.000Z","id":"b3aa1563-6278-4b2e-b525-a2ccddcbb785","inputs":{"wf_WGS.Reads":"/ags-wdl-nas/c.tar.gz"},"outputs":{},"start":"2020-10-10T09:34:56.022Z","status":"Running","submission":"2020-10-10T09:34:49.989Z"}
    • 執行以下命令刪除WDL任務。
      ags wdl abort bd747360-f82c-4cd2-94e0-b549d775f1c7

      預期輸出:

      INFO[0000] bd747360-f82c-4cd2-94e0-b549d775f1c7 Aborting

通過命令列提交任務

您需要編寫WDL檔案和輸入的JSON檔案,通過提供的鏡像提交任務,其中CromwellServer的地址為叢集IP:nodeport。

  1. 建立bwa.wdl檔案和bwa.json檔案。
    • bwa.wdl檔案樣本:
      task bwa_mem_tool {
        Int threads
        Int min_seed_length
        Int min_std_max_min
        String reference
        String reads_fq1
        String reads_fq2
        String outputdir
        String fastqFolder
        command {
              mkdir -p /bwa/${fastqFolder}
              cd /bwa/${fastqFolder}
              rm -rf SRR1976948*
              wget https://ags-public.oss-cn-beijing.aliyuncs.com/alignment/subset_assembly.fa.gz
              wget https://ags-public.oss-cn-beijing.aliyuncs.com/alignment/SRR1976948_1.fastq.gz
              wget  https://ags-public.oss-cn-beijing.aliyuncs.com/alignment/SRR1976948_2.fastq.gz
              gzip -c ${reference} > subset_assembly.fa
              gunzip -c ${reads_fq1} | head -800000 > SRR1976948.1
              gunzip -c ${reads_fq2} | head -800000 > SRR1976948.2
              bwa index subset_assembly.fa
              bwa aln subset_assembly.fa SRR1976948.1 > ${outputdir}/SRR1976948.1.untrimmed.sai
              bwa aln subset_assembly.fa SRR1976948.2 > ${outputdir}/SRR1976948.2.untrimmed.sai
        }
        output {
          File sam1 = "${outputdir}/SRR1976948.1.untrimmed.sai"
          File sam2 = "${outputdir}/SRR1976948.2.untrimmed.sai"
        }
        runtime {
          docker: "registry.cn-hangzhou.aliyuncs.com/plugins/wes-tools:v3"
          memory: "2GB"
          cpu: 1
        }
      }
      workflow wf {
        call bwa_mem_tool
      }
    • bwa.json檔案樣本:
      {
      "wf.bwa_mem_tool.reference": "subset_assembly.fa.gz",#reference filename。
      "wf.bwa_mem_tool.reads_fq1": "SRR1976948_1.fastq.gz",#fastq1 filename
      "wf.bwa_mem_tool.reads_fq2": "SRR1976948_2.fastq.gz",#fastq2 filename
      "wf.bwa_mem_tool.outputdir": "/ags-wdl/bwatest/output", #output path,the result will output in xxx-xxx.cn-beijing.nas.aliyuncs.com:/wdl/bwatest/output,you should make sure the path exists.
      "wf.bwa_mem_tool.fastqFolder": "fastqfolder" #任務執行的工作目錄。
      }
  2. 執行以下命令提交WDL任務。
    docker run -e CROMWELL_SERVER=192.16*.*.** -e CROMWELL_PORT=30384 registry.cn-beijing.aliyuncs.com/tes-wes/cromwellcli:v1 run resources/bwa.wdl resources/bwa.json

    預期輸出:

    -------------Cromwell Links-------------
    http://192.16*.*.**:30384/api/workflows/v1/5d7ffc57-6883-4658-adab-3f508826322a/metadata
    http://192.16*.*.**:30384/api/workflows/v1/5d7ffc57-6883-4658-adab-3f508826322a/timing
    {
        "status": "Submitted", 
        "id": "5d7ffc57-6883-4658-adab-3f508826322a"
    }