前面我們複習了docker的用法,而且我還帶領大家親自構建了一個自己的docker容器,也成功的在測試數據集裏面運行了,但是前面我說的,我這次搞docker是因爲真的有需求,那麼就必然要處理我的真實數據。
這個時候的bam文件是10-20G大小了,不是我GitHub上面的幾十個K的小測試文件,真正跑起來才發現,進程總是被kill掉,因爲內存的問題,所以就有了本教程。
前面第三講我創建了自己的docker容器,而且還成功的在小數據集上面測試成功啦,但是想真正分析大數據的時候發現進程總是被killed,仔細想了想應該是docker容器能調用的資源被限制,所以也搜索學習了一些。
在使用 docker 運行容器時,一臺主機上可能會運行幾百個容器,這些容器雖然互相隔離,但是底層卻使用着相同的 CPU、內存和磁盤資源。如果不對容器使用的資源進行限制,那麼容器之間會互相影響,小的來說會導致容器資源使用不公平;大的來說,可能會導致主機和集羣資源耗盡,服務完全不可用。
docker 作爲容器的管理者,自然提供了控制容器資源的功能。正如使用內核的 namespace 來做容器之間的隔離, docker 也是通過內核的 cgroups 來做容器的資源限制。 可以參考:
- 使用 docker 對容器資源進行限制
- Docker 運行時資源限制
本來我也是按部就班的理解前輩們的教程,調整參數希望可以調度資源,最後始終無法解決問題,就求助了在華爲生信雲容器的北大胡博士,他指出來了我的docker是安裝在我的iMac上面,所以這些教程都不能使用。
如果我要修改內存和CPU,直接跳轉界面版本的docker的preference 即可。
如果資源配置好了?
docker run -it -v /Users/jmzeng/data/project/:/work_dir jmzeng/lancet:v1.0 /bin/bash root@ca3a9e72b32f:/# cd /work_dir/lancet/ ## 腳本如下: ## 也可以設置;--num-threads ref=/work_dir/ref/Homo_sapiens_assembly38.fasta cat config |while read id; do arr=($id) normal_bam=${arr[1]} tumor_bam=${arr[2]} sample=${arr[0]} echo $id; for chrom in {1..22} X Y M;do echo $chrom echo "lancet --tumor $tumor_bam --normal $normal_bam --ref $ref --num-threads 4 --reg chr$chrom > ${sample}_chr${chrom}.vcf" lancet --tumor $tumor_bam --normal $normal_bam --ref $ref --num-threads 4 --reg chr$chrom > ${sample}_chr${chrom}.vcf done done # lancet --tumor t1.bam --normal n.bam --ref ref/Homo_sapiens_assembly38.fasta --reg chr3:179230000-179240000 > t1.vcf
現在就可以批量把所有的腫瘤配對WES數據走一波lancet軟件,得到somatic的vcf格式的突變記錄文件啦。非常方便。可以看到docke把mac的cpu全部調用了