集群管理工具(SGE, Sun Grid Engine), 用於從登陸節點上向計算節點進行任務投遞
SGE或者其他集群管理工作做的事情就是將用戶投遞的任務進行排隊,然后將任務交給能夠運行的計算節點執行,工作流程可以分為四步:
- 接受用戶投放的任務
- 在任務運行以前,將任務放到一個存儲區域
- 發送任務到一個執行設備,並監控任務的運行
- 運行結束寫回結果並記錄運行日志
SGE的常用命令
任務投遞
SGE中投遞任務所用到的命令是qsub
. 最簡單的用法是下面這種,即,將要執行的命令通過標准輸入的方式傳遞給qsub
echo "ls -l " | qsub
投遞之后可以用qstat
查看自己投遞的任務的運行情況,如下圖

第一列是任務編號, 第二列是優先級,第三列是任務名字,在參數里沒有特別說明的情況下,SGE會用任務的來源進行命令,STDIN表示來自於標准輸入,第四列是用戶名,第五列是運行狀態("r"表示運行中), 第六列表示任務投遞和開始時間,第七列是任務投遞的節點,第8列則是要申請的線程數?。在執行完成后會在家目錄下生成"STDIN.e7883"和"STDIN.o7883", 其中7883就是任務編號, 前者存放標准錯誤輸出, 后者存放標准輸出, 因此"cat STDIN.o7883"的內容就是ls -l
的內容。
另一種方法是先寫一個腳本然后投遞,比如先編輯一個文件"ls.sh", 內容如下,然后用"qsub ls.sh"投遞任務。
ls -l
跟之前一樣,最后在家目錄下產生了"ls.sh.exxxx"和"ls.sh.exxxx"兩個文件
當然實際時肯定沒有那么簡單,我們需要增加各種參數來調整qsub
的行為,用qsub -help
可以看完整的參數,但是常用的為如下幾個
- -q xxx : 指定要投遞到的隊列,如果不指定的話,SGE會在用戶可使用的隊列中選擇一個滿足要求的隊列。
- -V: 將當前的環境變量傳遞到執行命令的節點中
- cwd: 在當前目錄下執行任務, sge的日志會輸出到當前路徑。 不增加該指令,所有投遞的任務都會在家目錄下執行
- -l resource=value: 請求資源數, 例如
-l vf=25G -l h=node1
就是任務的預估內存要25G(內存估計的值應稍微大於真實的內存,內存預估偏小可能會導致節點跑掛), 申請在node1上運行 - -S /bin/bash: 表示在bash環境下執行命令。默認tcsh.
shell 是一種命令行程序, linux 用戶可以通過 shell 與操作系統內核進行交互。
shell 分為好幾種:sh,bash,csh,tcsh, 其中 tcsh 是 csh 的增強版,常用的兩種 shell 就是 bash 和 tcsh。
一般linux 默認shell 是 bash,但是IC公司用的較多的是 tcsh,二者的語法和內建命令相差較大,關於bash,網上資料非常多,這里主要記錄 tcsh 的語法和基本命令。
- -pe openmpi 4: 表示使用openmpi進行並行運算,且申請的線程是4,
- -N 任務名: 手動執行任務的名字
- -j y|n :是否將標准輸入和標准輸入合並成一個文件
- -sync y|n: 是否等待任務結束,返回退出碼
- -o path: 指定標准輸出的文件夾
那么接下來就可以添加這些參數運行一些命令了,例如在命令行里投遞一個比對任務
echo "bowtie2 -p 8 -x index/ref -1 data/A_1.fq -2 data/A_2.fq | samtools sort > A.bam" | qsub -V -cwd -l vf=25G -S /bin/bash -pe openmpi 8 -N A.bt2
這些參數除了在外部設置外,還可以在shell腳本里設置,如下
#!/bin/bash #$ -S /bin/bash #$ -V #$ -cwd #$ -l vf=25G #$ -pe openmpi 8 #$ -N a.bt2 bowtie2 -p 8 -x index/ref -1 data/A_1.fq -2 data/A_2.fq | samtools sort > A.bam
查詢任務
除了任務投遞外,查詢任務也是一個非常常用的命令,除了剛才直接用qstat
查看,還有如下參數比較好用
qstat -f # 查看用戶任務
qstat -j jobId # 按任務id查看
qstat -explain a|c|A|E -j jobID # 查看任務任務並給出解釋
qstat -u user # 按用戶查看
任務狀態:
- qw: 表示等待狀態
- hqw: 任務掛起等待中,待依賴的任務完成后執行
- Eqw: 投遞任務出錯
- r: 表示任務正在運行
- s: 暫時掛起
- dr: 節點掛了之后,刪除任務就會出現這個狀態,只有節點重啟之后,任務才會消失
刪除任務
任務刪除也比較重要,畢竟偶爾會出現任務投遞出錯的情況
qdel -j 1111 刪除任務號為1111的任務
其他命令
- qrsh:與qsub相比,是交互式的投遞任務,注意參數:
-now yes|no
默認設置為yes- 若設置為yes,立即調度作業,如果沒有可用資源,則拒絕作業,任務投遞失敗,任務狀態為Eqw。
- 若設置為no,調度時如果沒有可用資源,則將作業排入隊列,等待調度。
- 例子: qrsh -l vf=*G -q all.q -now no -w n *sh
- qacct 從集群日志中抽取任意賬戶信息
- qalter 更改已提交但正處於暫掛狀態的作業的屬性
- qconf 為集群和隊列配置提供用戶界面
qconf -spl
查看可用並行環境
- qhold 阻止已提交作業的執行
- qhost 顯示SGE執行主機(即各個計算節點)的狀態信息
qhost -j
按照節點顯示任務qhost -F
展示每個節點的資源
- qlogin 啟動telnet或類似的登錄會話。
案例:一個投遞比對任務的簡單腳本
#!/bin/bash
set -e
set -u
set -o pipefail
threads=8
index=index/hg19
FQ_DIR="analysis/0-raw-data"
ALIGN_DIR="analysis/2-read-align"
LOG_DIR="analysis/log"
TMP_DIR="analysis/tmp"
mkdir -p ${ALIGN_DIR}
mkdir -p ${LOG_DIR}
mkdir -p ${TMP_DIR}
tail -n+2 download_table.txt | cut -f 6 | while read id;
do
echo "
bowtie2 --very-sensitive-local --mm -p $threads -x $index -U ${FQ_DIR}/$id.fastq.gz 2> ${LOG_DIR}/$id.bt2.log | \
samtools sort -@ 2 -m 1G -T ${TMP_DIR}/${id} -o ${ALIGN_DIR}/${id}.sort.bam" | qsub -V -cwd -pe openmpi $threads -N ${id}_bt2 -q all.q -S /bin/bash
done
來源: