《Python分布式計(jì)算》 第8章 繼續(xù)學(xué)習(xí) (Distributed Computing with Python)


序言
第1章 并行和分布式計(jì)算介紹
第2章 異步編程
第3章 Python的并行計(jì)算
第4章 Celery分布式應(yīng)用
第5章 云平臺(tái)部署Python
第6章 超級(jí)計(jì)算機(jī)群使用Python
第7章 測(cè)試和調(diào)試分布式應(yīng)用
第8章 繼續(xù)學(xué)習(xí)


這本書是一個(gè)簡(jiǎn)短但有趣的用Python編寫并行和分布式應(yīng)用的旅程。這本書真正要做的是讓讀者相信使用Python編寫一個(gè)小型或中型分布式應(yīng)用不僅是大多數(shù)開(kāi)發(fā)者都能做的,而且也是非常簡(jiǎn)單的。

即使是一個(gè)簡(jiǎn)單的分布式應(yīng)用也有許多組件,遠(yuǎn)多于單體應(yīng)用。也有更多的錯(cuò)誤方式,不同的機(jī)器上同一時(shí)間發(fā)生的事情也更多。

但是,幸好可以使用高質(zhì)量的Python庫(kù)和框架,來(lái)搭建分布式系統(tǒng),使用起來(lái)也比多數(shù)人想象的簡(jiǎn)單。

另外,并行和分布式計(jì)算正逐漸變?yōu)橹髁?,隨著多核CPU的發(fā)展,如果還繼續(xù)遵守摩爾定律,編寫并行代碼是必須的。

Celery、Python-RQ、Pyro等工具,只需要極少的精力,就可以獲得性能極大地提高。

但是,必須要知道,分布式應(yīng)用缺少?gòu)?qiáng)大的調(diào)試器和分析器,這個(gè)問(wèn)題不局限于Python。監(jiān)督和日志可以檢測(cè)性能的瓶頸,進(jìn)而查找到錯(cuò)誤?,F(xiàn)在這種缺少調(diào)試工具的狀況,需要改善。

本章剩下的部分回顧了前面的所學(xué),還給感興趣的讀者提了繼續(xù)學(xué)習(xí)哪些工具和課題的建議。

前兩章

本書的最初章節(jié)講解了一些并行和分布式計(jì)算的基本理論。引入了一些重要的概念,如共享內(nèi)存和分布式內(nèi)存架構(gòu)以及它們之間的差異。

這兩章還用阿姆達(dá)爾定律研究了并行加速的基本算法。討論的收獲是,投入并行計(jì)算的收益是遞減的。另外,繞過(guò)阿姆達(dá)爾定律的方法之一是增加的問(wèn)題的規(guī)模,使并行代碼所占的份額更大(古斯塔夫森定律)。

另一個(gè)收獲是,盡量保持進(jìn)程間通訊越小越好。最好讓各個(gè)進(jìn)程都是獨(dú)立的。進(jìn)程之間的通訊越少,代碼越簡(jiǎn)單,損耗越少。

大多數(shù)實(shí)際場(chǎng)景都需要一系列扇出和扇入同步/還原步驟,大多數(shù)框架都能合理有效地處理這些步驟。然而,并行步驟中的數(shù)據(jù)依賴或大量消息傳遞通常會(huì)成為嚴(yán)重的問(wèn)題。

提到的另一種架構(gòu)是數(shù)據(jù)列車或數(shù)據(jù)并行。這是一種處理方式,其中一個(gè)啟動(dòng)大量的worker進(jìn)程,超過(guò)可用硬件資源的數(shù)量。正如所看到的,數(shù)據(jù)并行的主要優(yōu)點(diǎn)是很好的伸縮性和更簡(jiǎn)單的代碼。此外,大多數(shù)操作系統(tǒng)和任務(wù)規(guī)劃器在交錯(cuò)I/O和計(jì)算方面會(huì)做得很好,從而掩蓋系統(tǒng)延遲。

我們還研究了兩種完全不同的編程范式:同步和異步編程。我們看到Python對(duì)futures、回調(diào)、協(xié)程的支持很好,這是異步編程的核心。

正如我們所討論的,異步代碼具有避免,或者減少了競(jìng)爭(zhēng)條件,因?yàn)橹挥幸欢未a可以在給定的時(shí)間點(diǎn)運(yùn)行。這意味著,數(shù)據(jù)訪問(wèn)模式被大大簡(jiǎn)化了,但代碼和調(diào)試變復(fù)雜了;當(dāng)使用回調(diào)和協(xié)程,很難跟蹤執(zhí)行路徑。

在本書中,我們看到了使用線程、多進(jìn)程、協(xié)程的并行代碼的性能。對(duì)于I/O操作,我們看到這三個(gè)并發(fā)策略可以實(shí)現(xiàn)顯著的加速。然而,由于Python全局鎖,CPU操作并沒(méi)有獲得加速,除非使用多個(gè)進(jìn)程。

同步和異步編程都有其優(yōu)點(diǎn)。使用的越多,越會(huì)發(fā)現(xiàn)線程和系統(tǒng)編程的C和C++很像。協(xié)程的優(yōu)點(diǎn)之一就是避免競(jìng)爭(zhēng)條件。多個(gè)進(jìn)程,雖然在一臺(tái)機(jī)器上相當(dāng)笨重,但為更一般的分布式計(jì)算架構(gòu)鋪平了道路。使用哪種風(fēng)格取決于個(gè)人喜好和必須使用的特定庫(kù)。

工具

在第3章中,我們學(xué)習(xí)了Python的標(biāo)準(zhǔn)庫(kù)模塊,來(lái)編寫并行應(yīng)用。我們使用了threadingmultiprocessing模塊,還使用了更為高級(jí)的concurrent.futures模塊。

我們看到Python為分布式并行應(yīng)用構(gòu)建了一個(gè)堅(jiān)固的基礎(chǔ)。前面的是哪個(gè)模塊都是Python安裝包自帶的,沒(méi)有外部依賴,因此很受歡迎。

我們?cè)诘?章學(xué)習(xí)了一些第三方Python模塊,包括Celery、Python-RQ和Pyro。我們學(xué)習(xí)了怎么使用它們,并看到它們都很容易使用。

它們都需要一些內(nèi)部組件,比如消息代理、數(shù)據(jù)庫(kù)或nameserver,它們可能不適用于所有情況。同時(shí),它們都可以讓開(kāi)發(fā)者輕易地開(kāi)發(fā)小型和中型的分布應(yīng)用。它們都有活躍的社區(qū)給予支持。

關(guān)于代碼的性能,最重要的是分析哪些代碼是值得優(yōu)化的。如果使用更快的解釋器,比如pypy,不能使性能提高,就要考慮更優(yōu)化的庫(kù),比如對(duì)數(shù)值代碼使用Numpy,或使用C或Cython,它們都可以使性能提高。

如果這些方法不成,還可以考慮并發(fā)、并行和分布式結(jié)算,但會(huì)提高復(fù)雜性。

一個(gè)簡(jiǎn)單的辦法是使用數(shù)據(jù)并行(例如,對(duì)不同的數(shù)據(jù)啟用多個(gè)代碼實(shí)例)??梢允褂萌蝿?wù)規(guī)劃器,比如HTCondor。

稍微復(fù)雜一點(diǎn)的辦法是使用concurrent.futures或Celery,使代碼并行化。高級(jí)用戶,特別是HP用戶,還可以考慮使用MPI作為進(jìn)程間通訊框架。

但是,并非所有的分布式應(yīng)用都要用到Celery、Python-RQ和Pyro。特別是當(dāng)應(yīng)用需要復(fù)雜、高性能、分布式圖片處理,使用Celery就不好。

此時(shí),開(kāi)發(fā)者可以使用工作流管理系統(tǒng),例如Luigi (https://github.com/spotify/luigi),或流處理,比如Apache Spark或Storm。對(duì)于專門的Python工具,可以參考https://spark.apache.org/docs/0.9.1/python-programming-guide.html andhttps://github.com/Parsely/streamparse

云平臺(tái)和HPC

第5章簡(jiǎn)要介紹了云計(jì)算和AWS。這是現(xiàn)在的熱點(diǎn),原因很簡(jiǎn)單:只要很少的投入,幾乎不需要等待,就可以租用一些虛擬機(jī),還可以租數(shù)據(jù)庫(kù)和數(shù)據(jù)存儲(chǔ)。如果需要更多的性能,可以方便地進(jìn)行擴(kuò)展。

Things, unfortunately, are never as simple as vendor brochures like to depict, especially when outsourcing a critical piece of infrastructure to a third party whose interests might not be perfectly aligned with ours.

不過(guò),事情不像銷售商手冊(cè)描述的那樣簡(jiǎn)單,特別是當(dāng)把一個(gè)重要的工作外包給一個(gè)可能與我們的利益不完全一致的第三方的時(shí)候。

我的建議是總是設(shè)想最壞的情況,并在本地自動(dòng)備份整個(gè)應(yīng)用及其軟件棧(至少在單獨(dú)的個(gè)體上)。理想情況下(但實(shí)際上并不是這樣),人們會(huì)在一個(gè)完全獨(dú)立的云平臺(tái)上運(yùn)行一個(gè)縮減的、但最新的完整應(yīng)用的拷貝,作為發(fā)生錯(cuò)誤的保險(xiǎn)。

使用第三方服務(wù)時(shí),進(jìn)行本地備份是非常重要的。用戶虛擬機(jī)和數(shù)據(jù)被刪除,不可找回,這種錯(cuò)誤絕不要發(fā)生。還要考慮過(guò)度依賴某個(gè)服務(wù)商,當(dāng)應(yīng)用過(guò)大時(shí),遷移到另一個(gè)服務(wù)商幾乎是不可能的。

只使用最小公分母(例如,只使用EC2和AWS)既有吸引力,也可能讓人沮喪,只能使用AWS提供的功能。

總之,云平臺(tái)是一把雙刃劍。對(duì)于小團(tuán)隊(duì)和小應(yīng)用來(lái)說(shuō),它無(wú)疑是方便和低成本的。對(duì)于大型應(yīng)用程序或處理大量數(shù)據(jù)的應(yīng)用來(lái)說(shuō),它可能是相當(dāng)昂貴的,因?yàn)閹捦浅YF。

此外,學(xué)術(shù)界、政府部門或政府機(jī)構(gòu)的團(tuán)隊(duì)可能很難獲得支付云平臺(tái)所需的資金。事實(shí)上,在這些部門,通常更容易獲得資金購(gòu)買設(shè)施自建而不是服務(wù)。

另一個(gè)關(guān)于嚴(yán)重限制了云計(jì)算在許多情況下的適用性問(wèn)題,就是數(shù)據(jù)隱私和數(shù)據(jù)托管問(wèn)題。例如,大公司往往不愿意在別人的機(jī)器上存放他們私有的,通常是機(jī)密的數(shù)據(jù)。

醫(yī)療數(shù)據(jù),這類與客戶或患者唯一相關(guān)的數(shù)據(jù),對(duì)它應(yīng)該存儲(chǔ)在哪里以及如何使用有它自己的一套法律限制。最近美國(guó)有關(guān)國(guó)家監(jiān)管部門要求歐洲公司使用云平臺(tái)時(shí),加大對(duì)其數(shù)據(jù)的隱私權(quán)和法律管轄權(quán)管理。

HPC使用的工具,在這幾十年來(lái)還是只限于自身的范圍,沒(méi)怎么用到其他領(lǐng)域。

雖然有若干原因?qū)е铝诉@個(gè)問(wèn)題,還是要學(xué)習(xí)下任務(wù)規(guī)劃器,如HTCondor,和如何使用它。HTCondor可以在許多不同的環(huán)境中使用。它是一個(gè)強(qiáng)大的分布式計(jì)算中間件,適用于小型和大型應(yīng)用。

現(xiàn)在的任務(wù)規(guī)劃器提供了大量的功能,它們?cè)谌蒎e(cuò)、工作流管理和數(shù)據(jù)移動(dòng)規(guī)劃等領(lǐng)域尤其強(qiáng)大。它們都支持運(yùn)行任何可執(zhí)行文件,這意味著它們可以輕易的規(guī)劃和運(yùn)行Python代碼。

讓人感興趣的可能是用云平臺(tái)虛擬機(jī)動(dòng)態(tài)擴(kuò)展HPC系統(tǒng)。有些任務(wù)規(guī)劃器自身支持使用適配器,如Eucalyptus。

高級(jí)HPC用戶可能希望將其應(yīng)用指定運(yùn)行在機(jī)群的某些機(jī)器上。事實(shí)上,事實(shí)上,HPC系統(tǒng)中的網(wǎng)絡(luò)結(jié)構(gòu)是按層次結(jié)構(gòu)組織的:高速網(wǎng)絡(luò)連接同一級(jí)上的節(jié)點(diǎn)。下一個(gè)性能層連接同一個(gè)機(jī)柜中或一組機(jī)柜。InfiniBand等級(jí)連接剩下的機(jī)柜租,最后,較慢的以太網(wǎng)連接機(jī)群,彼此連接和連接外部。

結(jié)果是,應(yīng)用程序需要大量的進(jìn)程間通信和/或數(shù)據(jù)遷移,使用較少數(shù)量的位于同一級(jí)的處理器,而不是多個(gè)等級(jí)的處理器,就可以使性能大幅提高。類似的方法也適用于所使用的網(wǎng)絡(luò)文件系統(tǒng),以及是否為元文件的大量操作付出性能的代價(jià)。

當(dāng)然這些優(yōu)化,缺點(diǎn)是它們是不可移植的,這是由于HPC系統(tǒng)的聲明周期只有幾年,因此需要盡量使用最高性能的代碼(這是HPC集群存在的理由)。

調(diào)試和監(jiān)控

第7章中介紹少的日志、監(jiān)控、分析和吊事分布式系統(tǒng),即使放在現(xiàn)在,也是困難的工作,尤其是使用的語(yǔ)言不是C、C++或Fortran。這里沒(méi)有什么要說(shuō)的了,除了有一個(gè)重要的空白要填補(bǔ)。

多數(shù)的中大型團(tuán)隊(duì)使用日志聚合器如Sentry (https://getsentry.com),和監(jiān)控方案如Ganglia (http://ganglia.sourceforge.net)。

對(duì)于Python應(yīng)用,可以使用IO監(jiān)控工具,如Darshan (http://www.mcs.anl.gov/research/projects/darshan/),和分布式分析工具M(jìn)AP (http://www.allinea.com/products/map)。

繼續(xù)學(xué)習(xí)

正如我們所看到的,用Python中構(gòu)建小型、中型分布式應(yīng)用并不是特別困難。一旦分布式系統(tǒng)發(fā)展到更大的規(guī)模,所需的設(shè)計(jì)和開(kāi)發(fā)工作量也將以超線性方式增長(zhǎng)。

在這種情況下,就需要更牢固的分布式系統(tǒng)理論。在線和離線都有許多可用的資源。許多大學(xué)都開(kāi)設(shè)有關(guān)這個(gè)課程,其中一些是在線免費(fèi)的。

一個(gè)例子就是ETH的《分布式計(jì)算原理》(http://dcg.ethz.ch/lectures/podc_allstars/index.html),它包含了一些基本原理,包括同步、一致性和最終一致性(包括著名的CAP定理)。

最后要說(shuō),初學(xué)者應(yīng)該感到鼓舞。用幾行代碼的一個(gè)簡(jiǎn)單框架,如Python-RQ,就可以讓代碼性能大幅提升!


序言
第1章 并行和分布式計(jì)算介紹
第2章 異步編程
第3章 Python的并行計(jì)算
第4章 Celery分布式應(yīng)用
第5章 云平臺(tái)部署Python
第6章 超級(jí)計(jì)算機(jī)群使用Python
第7章 測(cè)試和調(diào)試分布式應(yīng)用
第8章 繼續(xù)學(xué)習(xí)


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容