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指令:
可以看到成功提交後,返回了一個任務ID號。可以通過condor_q指令查看當前的任務隊列狀態:
ST這一列的I代表idle,也就是閒置的。這時由於任務剛提交上去,還來不及匹配任務機器或者沒有更新狀態,多刷新幾次,可以看到這一欄會編程R,也就是Run,表示運行狀態:
繼續輸入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目錄就會自動清空。
至此,一個簡單的分佈式計算流程就算完成了。實際的運用當然沒這麼簡單,但是總體的思路都是這樣的:
拆分任務——提交任務——監視任務——任務完成——合併結果。