最近在跑新抗原的流程,遇到了一些问题记录下来:
1,前期跑GATK4,详细教程可见GATK4+mutect2 call somatic mutation - 简书 (jianshu.com), 大批量投上服务器的时候,因为服务器的node1改名字成为了master,所以投任务时不能自动避开master节点,于是在流程中加了几行perl 代码,可以随机选取除了节点1的节点,特此记录下:
#!usr/bin/perl -w
use List::Util qw(shuffle);
my @data = ("Node2", "Node5", "Node6", "Node7","Node8");
my @shuffled_name = shuffle(@data);
(my $a )= @shuffled_name;
print OUT2 "#!usr/bin/sh\n# qsub tasks\n";
print OUT2 "qsub -cwd -l vf=45g -l hostname=$a $outdir/02.GATK/$basename/$basename.sh\n";
close OUT2;
2 解决完这个问题又发现另外一个问题,就是当一下子投很多任务的时候,服务器是承受不了的,于是改投一次35个,但是还是不行。最后思考可以这么处理,一次投10到15个,然后利用qhost命令时刻观测着服务器的使用情况。 但是这个问题就导致跑程序时间拖久了。
HOSTNAME ARCH NCPU NSOC NCOR NTHR LOAD MEMTOT MEMUSE SWAPTO SWAPUS
----------------------------------------------------------------------------------------------
global - - - - - - - - - -
Master lx-amd64 48 2 24 48 1.01 62.2G 2.1G 32.0G 65.7M
Node2 lx-amd64 32 2 16 32 6.11 62.7G 8.5G 128.0G 2.8G
Node5 lx-amd64 40 2 20 40 1.99 125.6G 6.2G 128.0G 466.6M
Node6 lx-amd64 56 2 28 56 0.85 377.6G 21.4G 128.0G 441.8M
Node7 lx-amd64 64 2 32 64 15.92 376.2G 29.1G 64.0G 181.0M
Node8 lx-amd64 80 2 40 80 0.01 251.2G 10.4G 32.0G 58.8M
3 然后又发现有一些节点在跑的时候,投上去了时好,时而不好,会僵掉。 集中在节点5和节点6,具体什么原因,我也不知道,大概是跑的久了,服务器也累吧。于是删掉这个任务重新跑。
4 然后就是利用conda 安装了新抗原的软件,这一步还算顺利,本地跑没有出什么大错。但是后面投到集群上有了问题,就是可以在本地跑,但是不能在服务器上跑。(我没有管理员权限) 看了报错信息,大概是有一个perl的模块在集群上跑是找不到的。报错信息是这样的:
Can't locate Parallel/ForkManager.pm in @INC
但是我在本地是安装了的。 应该是服务器跑的时候没有找到。
这样的情况一般是服务器默认的寻找路径和我安装这个模块的路径不匹配。一般是在~/.bash_profile里面修改,export 我自己的安装这个模块的路径。
于是修改了~/.bash_profile文件,增加了两行。
$PATH;
export PATH=/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/bin/:$PATH;
export PERL5LIB=/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/lib/perl5/site_perl/5.22.0/:$PERL5LIB;
export PERLLIB=/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/lib/perl5/site_perl/:$PERLLIB;
然后
source ~/.bash_profile
但是还是不能跑,还是不行。万般无奈的我,决定向管理员求助,就是能不能管理员在集群上安装这个perl 模块。但是被告知不太行。 最后经过搜索整个应该是环境的问题。于是尝试把报错信息的perl脚本的第一行由
#!user/bin/env perl
改成了
#! user/bin/perl
但是程序还是没有跑通,我这时利用命令 perl -V 去看@INC中的默认路径,发现还有以前没有更改过的路径。就像是不是需要关掉现在的putty,重新打开一个,于是关掉现在的putty,重新打开一个,再用perl -V看,确实有了变化,下次修改完~/.bash_profile文件,需要再用perl -V 看下,没有问题了,再做下一步。 但是即使改了这些还是有问题的。
于是我手动修改perl 脚本的lib,在perl的第一行加上:
use lib '/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/lib/perl5/site_perl/5.22.0';
这样可以跑了,但是后面还有其他的perl 脚本还会遇到这种问题,于是我再修改。 思考理论上说,我修改了bashrc 文件应该没有问题,perl -V也在@INC中看到了有我自己的安装perl模块的路径在,为什么依然还会报错,直到一个一个修改。 但是一个一个修改很麻烦。
于是我就想是不是在export路径的过程中,需要再特异export的精细一点。 于是在~/.bash_profile中加入一行。
export PERLLIB=/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/lib/perl5/site_perl/:/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/lib/perl5/site_perl/5.22.0:$PERLLIB
但是还是不行,难道真的需要一个一个修改perl 吗?很多问题都是权限的问题。
后面我又返回去阅读 polysolver的github的网站,发现其实作者在最开始已经说了要export PERL5LIB="$CONDA_PREFIX/lib/perl5/5.22.0/"
当时看这个还不理解为什么要这么做,现在知道了一般作者这么写应该是调用conda里面的perl的库,确实,自从换了盘后,我的好多软件也是在conda里面安装的。 于是便在每个shell脚本前面加上了export PERL5LIB="$CONDA_PREFIX/lib/perl5/5.22.0/" ,这一行。这时候还会报错,具体还是缺少了一些模块。这时候可以在polysolver的conda 环境中。
记住一定要在conda的环境下安装,不然这个模块会安装到其他地方。
然后,完成了这些过程,报错信息关于
Can't locate Parallel/ForkManager.pm in @INC
这种报错信息没有了,但是换了一种报错信息
/usr/bin/perl: symbol lookup error: /Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/lib/perl5/5.22.0/x86_64-linux-thread-multi/auto/List/MoreUtils/XS/XS.so: undefined symbol: Perl_xs_handshake
这种情况一般是系统中有两个版本的perl,我看了下确实/usr/bin/perl是版本16,而我安装的是v22。版本不同。这样perl无法调用另一个版本的库。
这个时候,我就明白为什么前面会有那么多报错的原因了,具体是conda安装好了很多软件,所以在本地跑的时候,可以跑通,但是服务器优先调用/usr/bin/perl,所以投到服务器上才会有很多软件都不能用的情况。 而虽然服务器有perl,但是版本和conda 的perl 不兼容,但是如果不用conda只用服务器,很多软件我也没有权限安装。 所以这时候需要解决的就是,告诉服务器,不仅仅要找我的这个安装好的perl模块库了,还要告诉它调用其他软件,也从我这里来调用吧,这样就不会出现版本不兼容的问题了。前面其实也遇到了投到服务器上无法找到samtools的报错信息,于是我人为的修改了程序中samtools的路径,把samtools的路径设置成自己conda的samtools的路径。
可是问题来了,怎么告诉服务器,调用我的conda的bin文件或者perl呢?
是不是同样的道理,export conda的bin到shell中?
我尝试在~/.bash_profile 中,加入
export PATH = "/Bailab6/PROJECT/liuyang/bin/miniconda3/envs/polysolver/bin/"
并且在shell中也加了这一句,尝试一下如何。