部署實(shí)戰(zhàn):用SSH與hostfile構(gòu)建分布式集群)
SCOOP多機(jī)部署實(shí)戰(zhàn)用SSH與hostfile構(gòu)建分布式集群【免費(fèi)下載鏈接】scoopSCOOP (Scalable COncurrent Operations in Python)項(xiàng)目地址: https://gitcode.com/gh_mirrors/scoop/scoopSCOOPScalable COncurrent Operations in Python是Python生態(tài)中輕量而強(qiáng)大的分布式計(jì)算框架本文聚焦SCOOP多機(jī)部署這一核心場景帶你用 SSH 免密登錄與 hostfile 配置文件在幾分鐘內(nèi)把多臺機(jī)器拼成一個(gè)可用的分布式集群。無論你是想跑蒙特卡洛模擬、進(jìn)化算法還是大規(guī)模數(shù)據(jù)處理這套部署方法都能讓 Python 程序從單機(jī)并行平滑升級到跨節(jié)點(diǎn)并行。為什么選擇 SCOOP 構(gòu)建分布式集群相比 multiprocessing 只能單機(jī)使用、標(biāo)準(zhǔn) futures 無法跨節(jié)點(diǎn)SCOOP 天然支持通過網(wǎng)絡(luò)調(diào)用多臺計(jì)算機(jī)的計(jì)算力。它遵循 Broker 模式一個(gè) Broker 負(fù)責(zé)任務(wù)分發(fā)多個(gè) Worker 進(jìn)程執(zhí)行任務(wù)Root 節(jié)點(diǎn)運(yùn)行你的主程序。這種架構(gòu)讓你只需要改動少量代碼就能享受集群級的并行能力。上圖展示的正是 SCOOP 的任務(wù)分發(fā)思想Root 把任務(wù)拆解、分發(fā)到各個(gè) Worker最終匯聚結(jié)果——這棵任務(wù)樹就是多機(jī)集群上每天都在發(fā)生的事情。部署前需要準(zhǔn)備什么開始 SCOOP多機(jī)部署 之前請確認(rèn)每臺節(jié)點(diǎn)滿足以下條件Python 2.6 或 3.2建議使用較新版本安裝 greenlet、pyzmq 等依賴每臺機(jī)器都裝有 SSH 客戶端與服務(wù)端節(jié)點(diǎn)之間網(wǎng)絡(luò)互通建議同一局域網(wǎng)主控機(jī)執(zhí)行安裝命令即可完成基本準(zhǔn)備pip install scoop其余依賴如 pyzmq、greenlet建議在各節(jié)點(diǎn)分別安裝Windows 用戶需額外準(zhǔn)備 OpenSSH 或 Cygwin 環(huán)境。第一步配置 SSH 免密登錄關(guān)鍵前提SCOOP 啟動遠(yuǎn)程 Worker 時(shí)會通過 SSH 命令連接各節(jié)點(diǎn)整個(gè)過程不能有任何交互式提示因此免密登錄是部署的硬性條件。在主控機(jī)上執(zhí)行ssh-keygen -t rsa ssh-copy-id usernode1 ssh-copy-id usernode2如果你的系統(tǒng)沒有ssh-copy-id可以手動把~/.ssh/id_rsa.pub內(nèi)容追加到各節(jié)點(diǎn)的~/.ssh/authorized_keys文件中。如果節(jié)點(diǎn)使用非默認(rèn) SSH 端口或指定用戶名請?jiān)趡/.ssh/config中配置好SCOOP 會自動讀取。完成驗(yàn)證ssh node1能直接登錄不輸密碼即成功。這一步做好后續(xù) SCOOP多機(jī)部署 才算真正開始。第二步編寫 hostfile 配置文件hostfile 是 SCOOP 讀取集群節(jié)點(diǎn)的清單文件格式非常簡單——每行一個(gè)主機(jī)名后面跟該主機(jī)要啟動的 Worker 數(shù)量數(shù)量可省略省略時(shí)按該機(jī) CPU 核數(shù)自動分配node1 4 node2 node3 2上面示例表示node1 啟動 4 個(gè) Workernode2 按核數(shù)自動分配node3 啟動 2 個(gè) Worker。參考測試文件 test/hostfilesim.txt 可以看到更多格式細(xì)節(jié)。第三步一條命令啟動分布式集群一切就緒后在主控機(jī)執(zhí)行python -m scoop --hostfile hosts -vv -n 8 your_program.py參數(shù)含義-m scoop必須表示用 SCOOP 運(yùn)行程序--hostfile hosts指定集群節(jié)點(diǎn)清單-n 8總共啟動 8 個(gè) Worker-vv輸出更詳細(xì)的日志便于排查問題SCOOP 會讀取 hostfile在主節(jié)點(diǎn)啟動 Broker然后通過 SSH 在每臺機(jī)器上拉起對應(yīng)數(shù)量的 Worker自動完成部署。如果你想臨時(shí)指定節(jié)點(diǎn)而不用文件也可以用--host node1 node1 node2這種列表方式見 scoop/launcher.py 中參數(shù)解析邏輯。常見問題與避坑指南問題一遠(yuǎn)程 Worker 連不上 BrokerSCOOP 的 Worker 需要知道 Broker 的外部可達(dá)地址。如果集群內(nèi)沒有 DNS 解析請?jiān)趩用钪屑由?-external-hostname指定主控機(jī)對外可達(dá)的 IP 或主機(jī)名例如python -m scoop --hostfile hosts --external-hostname 192.168.1.100 -n 8 your_program.py問題二程序被每個(gè) Worker 重復(fù)執(zhí)行這是新手最容易踩的坑。SCOOP 的每個(gè) Worker 都會導(dǎo)入你的程序文件必須用if __name__ __main__:包裹主邏輯否則每個(gè) Worker 都會跑一遍完整程序造成重復(fù)計(jì)算甚至死鎖。問題三跨網(wǎng)段或防火墻導(dǎo)致連接失敗網(wǎng)絡(luò)環(huán)境復(fù)雜時(shí)可以啟用 SSH 隧道模式讓遠(yuǎn)程連接走加密隧道python -m scoop --hostfile hosts --tunnel -n 8 your_program.py隧道模式能規(guī)避路由問題但會略微降低通信速度適合測試環(huán)境。進(jìn)階技巧讓多機(jī)部署更高效Worker 數(shù)量與核數(shù)匹配Worker 數(shù)應(yīng)等于集群總核數(shù)過多會因上下文切換反而變慢-n參數(shù)會覆蓋 hostfile 中的數(shù)量設(shè)定。大數(shù)據(jù)別走網(wǎng)絡(luò)每個(gè)函數(shù)參數(shù)都會被序列化傳輸大數(shù)組應(yīng)放在模塊全局變量里讓 Worker 啟動時(shí)加載一次而不是每次調(diào)用都傳參考官方文檔 doc/usage.rst 中的性能建議。調(diào)度器環(huán)境適配SCOOP 能自動識別 SLURM、PBS、SGE 環(huán)境變量在超算或?qū)嶒?yàn)室網(wǎng)格中無需手動指定 hostfile示例腳本見 examples/submit_files/。排查利器-vv部署失敗時(shí)加上-vv查看完整日志scoop/launcher.py 的ScoopApp類會打印 Worker 分布詳情快速定位是哪臺機(jī)器沒起來。結(jié)語從 SSH 免密到 hostfile 配置再到一條命令拉起整個(gè)集群SCOOP 把復(fù)雜的多機(jī)部署簡化到了極致。按照本文的步驟你完全可以在半小時(shí)內(nèi)完成一個(gè)可用的分布式集群。當(dāng)任務(wù)從單機(jī)遷移到集群后記得用futures.map替代普通map就能立刻享受跨節(jié)點(diǎn)并行帶來的加速體驗(yàn)。現(xiàn)在就動手讓你的 Python 程序真正跑在多臺機(jī)器上吧【免費(fèi)下載鏈接】scoopSCOOP (Scalable COncurrent Operations in Python)項(xiàng)目地址: https://gitcode.com/gh_mirrors/scoop/scoop創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考