WDL(Workflow Description Language)是由Broad Institute開發的一種流程開發語言,簡單易用,能夠有效提高生物資訊工作流程的構建效率。本文介紹如何通過AGS在ACK叢集上編寫並執行WDL工作流程。
前提條件
- 已建立ACK叢集。具體操作,請參見建立Kubernetes託管版叢集。
- 已擁有一個或多個儲存服務(NAS儲存卷或者符合NFS協議的檔案儲存體、OSS儲存),用於儲存輸入資料和輸出結果。具體操作,請參見使用NAS動態儲存裝置卷。
在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,作為一個應用放在應用市場中,避免了複雜的環境配置,方便進行一鍵部署。
在控制台左側導覽列,選擇。
- 在應用市場頁面單擊應用目錄頁簽,然後搜尋並選中ack-ags-wdl。
- 在ack-ags-wdl頁面,單擊一鍵部署。
- 在建立面板中,選擇叢集和命名空間,然後單擊下一步。
- 在參數配置頁面,設定相應參數,然後單擊確定。
# 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為 naspvc1、naspvc2時,配置如下。naspvcs: - naspvc1 - naspvc2osspvcs 需要掛載的OSS儲存卷 是 當需要掛載的OSS儲存卷PVC為 osspvc1、osspvc2時,配置如下。osspvcs: - osspvc1 - osspvc2 - 配置NAS儲存。每一個NAS儲存卷對應執行任務容器中的一個路徑
nasbasepath。配置naspvcs需要為每一個NAS儲存卷進行詳細的參數配置。說明 其他參數配置保持預設即可。參數 說明 是否必須配置 配置方法 server NAS IP 是 輸入和輸出資料。需要修改為您自己NAS的url,和path。 path 掛載的子目錄 是 driver Flexvolume or CSI 是 叢集的儲存驅動,預設為CSI。當叢集使用Flexvolume時,需將該參數修改為Flexvolume。 nasbasepath NAS目錄在應用中的映射目錄 是 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。本文後面均以server為xxx-xxx.cn-beijing.nas.aliyuncs.com,絕對路徑為/wdl,映射路徑nasbasepath為/ags-wdl作為樣本。mountOptions 掛載選項 是 掛載參數。當使用您自己的NFS時,可以修改該參數進行適配。 mountVers 掛載版本 是 - 配置OSS儲存。每一個OSS儲存卷對應執行任務容器中的一個路徑
ossbasepath。配置osspvcs需要為每一個OSS儲存卷進行詳細的參數配置。參數 說明 是否必須配置 配置方法 bucket oss bucket 是 需要修改為您自己OSS的bucket名稱和url。 url oss url 是 options 掛載參數 是 預設為 -o max_stat_cache_size=0 -o allow_other,不用修改。akid AccessKey ID 是 您的AccessKey資訊,將會以Secret的方式部署在叢集中。 aksecret AccessKey Secret 是 path 掛載的子目錄 是 需要掛載的Bucket的子目錄。 ossbasepath OSS目錄在應用中的映射目錄 是 OSS目錄在應用中的映射目錄,在後續輸入資料和輸出資料時,需要將絕對目錄中的 bucket:path替換為ossbasepath。例如,bucket為shenzhen-test,path為/wdl,ossbasepath為/ags-wdl,輸入資料test.fq.gz在OSS中的儲存目錄為shenzhen-test:/wdl/test/test.fq.gz。當需要填寫輸入路徑時,應填寫為/ags-wdl/test/test.fq.gz,此時應用能夠正確的訪問到輸入資料。 - 配置其他參數。
參數 說明 是否必須配置 配置方法 workdir 工作目錄 是 需要在配置的 nasbasepath、ossbasepath中選擇一個作為工作目錄,任務運行過程中的中間檔案(script、error等)均會產生在該目錄下。provisiondir 動態建立PV目錄 是 需要在配置的 nasbasepath、ossbasepath中選擇一個作為動態建立PV的目錄,任務運行過程中的輸入輸出資料均會產生在該目錄下建立的PV中。nodeselector 任務調度支援label 否 如果需要將任務調度到特定的label節點時,可以填寫該欄位。配置 node-type=wdl會調度所有的任務到node-type=wdl的節點上。nodeport CromwellServer的服務暴露連接埠 是 CromwellServer的服務暴露連接埠。當您需要用自己的Widdler用戶端提交任務時,需要用到該參數,預設為32567。 namespace 專案命名空間 是 應用部署的命名空間,預設為wdl。 teskserver tesk服務網域名稱是 tesk的服務網域名稱,預設無需更改。cromwellserver CromwellServer 是 CromwellServer的服務網域名稱,預設無需更改。 cromwellport CromwellServer連接埠 是 CromwellServer的服務連接埠,預設無需更改。
執行以下命令,返回的結果顯示cromwellcli、cromwellserver、tesk-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命令列協助。
- 建立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" #任務執行的工作目錄 }
- bwa.wdl檔案樣本
- 將訪問叢集中的32567連接埠的流量轉寄到Service CromwellServer上。
kubectl port-forward svc/cromwellserver 32567:32567 - 執行以下命令配置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 - 執行以下命令在本地提交WDL任務。
ags wdl run resource/bwa.wdl resource/bwa.json --watch #watch參數可以讓該命令進行一個同步等待,直到該任務成功或失敗。預期輸出:
INFO[0000] bd747360-f82c-4cd2-94e0-b549d775f1c7 Submitted - 可選:您還可以在本地進行查詢、刪除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"}
- 執行以下explain命令查詢WDL任務。
- 執行以下命令刪除WDL任務。
ags wdl abort bd747360-f82c-4cd2-94e0-b549d775f1c7預期輸出:
INFO[0000] bd747360-f82c-4cd2-94e0-b549d775f1c7 Aborting
- 查詢WDL任務。
通過命令列提交任務
您需要編寫WDL檔案和輸入的JSON檔案,通過提供的鏡像提交任務,其中CromwellServer的地址為叢集IP:nodeport。
- 建立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" #任務執行的工作目錄。 }
- bwa.wdl檔案樣本:
- 執行以下命令提交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" }