集群任務管理系統SGE的簡明教程


 

集群管理工具(SGE, Sun Grid Engine), 用於從登陸節點上向計算節點進行任務投遞

 

SGE或者其他集群管理工作做的事情就是將用戶投遞的任務進行排隊,然后將任務交給能夠運行的計算節點執行,工作流程可以分為四步:

  1. 接受用戶投放的任務
  2. 在任務運行以前,將任務放到一個存儲區域
  3. 發送任務到一個執行設備,並監控任務的運行
  4. 運行結束寫回結果並記錄運行日志

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或類似的登錄會話。
Telnet協議是TCP/IP協議族中的一員,是Internet遠程登錄服務的標准協議和主要方式。它為用戶提供了在本地計算機上完成遠程主機工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務器。終端使用者可以在telnet程序中輸入命令,這些命令會在服務器上運行,就像直接在服務器的控制台上輸入一樣。可以在本地就能控制服務器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄服務器。Telnet是常用的遠程控制Web服務器的方法。

案例:一個投遞比對任務的簡單腳本


#!/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

來源:
https://baike.baidu.com/item/Telnet/810597?fr=aladdin


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM