高通量計算框架HTCondor(五)——分佈計算

1. 正文

1.1. 任務描述文件

前文提到過,HTCondor是通過condor_submit命令將提交任務的,這個命令需要提供一個任務描述文件。這個任務描述文件詳細描述了任務運行的需求情況,如下所示:

universe = vanilla
requirements = (Arch == "INTEL" || Arch == "X86_64") && (OpSys == "WINDOWS") && (Machine == "charlee-PC" || Machine == "DESKTOP-OVHV440") 
executable = D:\Work\HTC\Work\bin\TaskProgram.exe
should_transfer_files = YES
when_to_transfer_output = on_exit
notification = complete
skip_filechecks = true

arguments = 0
initialdir = D:\Work\HTC\Work\0
transfer_input_files = input.txt
transfer_output_files = output.dat
output = $(CLUSTER)_$(PROCESS).out
log = $(CLUSTER)_$(PROCESS).log
error = $(CLUSTER)_$(PROCESS).error
queue

arguments = 1
initialdir = D:\Work\HTC\Work\1
transfer_input_files = input.txt
transfer_output_files = output.dat
output = $(CLUSTER)_$(PROCESS).out
log = $(CLUSTER)_$(PROCESS).log
error = $(CLUSTER)_$(PROCESS).error
queue

...

arguments = 15
initialdir = D:\Work\HTC\Work\15
transfer_input_files = input.txt
transfer_output_files = output.dat
output = $(CLUSTER)_$(PROCESS).out
log = $(CLUSTER)_$(PROCESS).log
error = $(CLUSTER)_$(PROCESS).error
queue

universe參數表示HTCondor的運行環境,默認爲vanilla。vanilla提供的功能會少一些,但是使用也會較爲方便。如果要使用一些高級的功能,可以使用standard環境,standard環境提供了斷點和遷移的功能,不過需要一些額外的重鏈接操作生成特定的可執行程序。

requirements參數表示該一系列任務的需求。HTCondor採取了一種ClassAds匹配策略,每臺計算機會一直在Pool中廣播關於自己資源的Ad,通過這個參數,可以匹配該任務是否與該計算機適配。這裏設置的意思是選擇X86的Windows機器,且機器名稱爲"charlee-PC"或"DESKTOP-OVHV440"。使用"name == "slot1@USER-EHN3KRBP1V"的形式,甚至可以指定到某一核來運行。

executable也就是上一篇中實現的可執行程序。

should_transfer_files表示使用文件傳輸機制。文件傳輸機制也就是任務程序需要的數據,跟隨任務程序一起發送到任務機中運行。如果不使用文件傳輸機制,就需要如NFS或AFS這樣的共享文件系統。

when_to_transfer_output = on_exit表示當任務程序完成之後,會有輸出的文件一起傳送回本機。

接下來arguments開頭queue結尾的代碼描述了16組任務的詳細描述。initialdir是初始化目錄,也就是上一節中創建的每個分任務的目錄。

transfer_input_files表示傳送到任務機的文件。這個參數可以設置成具體的文件,目錄,設置是可執行程序依賴的dll。注意發送到任務機後這些文件與執行任務文件在同一個目錄中。

when_to_transfer_output表示發送回本機的文件。當任務程序運行完成後,會生成處理好的數據,可以通過這個參數將文件傳送回本機。

output表示任務程序的輸出文件,可以截獲任務程序的stdout流。

log表示集羣執行任務程序的狀態,一般是HTCondor框架自動生成。

error表示任務程序的錯誤文件,可以截獲任務程序的stderr流。

1.2. 提交任務

在命令提示符窗口中輸入condor_submit指令:

condor_submit指令

可以看到成功提交後,返回了一個任務ID號。可以通過condor_q指令查看當前的任務隊列狀態:

condor_q指令

ST這一列的I代表idle,也就是閒置的。這時由於任務剛提交上去,還來不及匹配任務機器或者沒有更新狀態,多刷新幾次,可以看到這一欄會編程R,也就是Run,表示運行狀態:

condor_q指令

繼續輸入condor_status,查看當前計算機資源的情況。這時的狀態刷新會更慢些,也可以多輸入幾次:

condor_status指令
condor_status指令

State表示資源佔用情況,Claimed表示已佔用,Claimed表示未佔用。Activity表示當前的活動狀態,Idle就是閒置,Busy表示繁忙。

通過以上指令,可以查看當前任務是否正常。等待直到condor_q中的任務隊列爲空,就說明當前所有的任務已經完成了。

1.3. 返回結果

根據任務描述文件,任務程序會返回一個輸出數據output.dat已經相關的日誌信息.log、.out、.error。任務完成後會回傳到各自的初始化目錄中:

返回結果

.out是任務程序的stdout流,可以用來輸出信息;.error是任務程序的stderr流,可以用來輸出錯誤信息。在任務程序中輸出信息和日誌是必要的,可以第一事件排查是哪一段代碼出問題。如果連這兩個文件都沒有,可以考慮是否是HTCondor的環境配置問題,或者任務描述文件是否出錯。

.log是HTCondor的輸出日誌,可以用來參考。output.dat就是任務程序的輸出數據了,當然這個數據因任務程序而異,任務程序輸出什麼,任務描述文件就返回對應的數據,當然也可以什麼都不用返回。

在HTCondor任務程序計算的過程中,會把任務程序傳送到對應的任務機器,也就是任務機器HTCondor安裝目錄的execute目錄中,運行時會看到任務程序,以及傳送過來的數據等:

返回結果

當然,在運行完成後,這個execute目錄就會自動清空。

至此,一個簡單的分佈式計算流程就算完成了。實際的運用當然沒這麼簡單,但是總體的思路都是這樣的:

拆分任務——提交任務——監視任務——任務完成——合併結果。

2. 相關

代碼和數據地址

上一篇
目錄
下一篇

發佈了73 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章