? ? 我的 PhD 研究方向是分布式系統(tǒng)订歪,我老板也是分布式系統(tǒng)出身脖祈,我們實(shí)驗(yàn)室在這方面的積累還算不錯(cuò),所以借此問題談?wù)勛约旱目捶ㄋ⒔J紫刃枰f明的是盖高,分布式系統(tǒng)是一個(gè)復(fù)雜且寬泛的研究領(lǐng)域,學(xué)習(xí)一兩門在線課程眼虱,看一兩本書可能都是不能完全覆蓋其所有內(nèi)容的喻奥。介于這篇文章是引導(dǎo)初學(xué)者入門,所以我個(gè)人覺得為初學(xué)者介紹一下當(dāng)前分布式系統(tǒng)領(lǐng)域的全貌捏悬,也許比直接推薦論文和課程更有幫助撞蚕。當(dāng)初學(xué)者對這個(gè)領(lǐng)域建立起一個(gè)大的 Picture 之后,可以根據(jù)自己的興趣过牙,有選擇性地深入不同領(lǐng)域進(jìn)行進(jìn)一步的學(xué)習(xí)甥厦。
? 本文主要試圖回答以下兩個(gè)問題:
? 1.? 近些年分布式系統(tǒng)領(lǐng)域都在做些什么纺铭。
? 2.? 為什么現(xiàn)在投入分布式系統(tǒng)的學(xué)習(xí)和研究是值得的。
? ? 我會(huì)盡可能多地去介紹更 “實(shí)用” 的分布式系統(tǒng)知識刀疙。
? ? 什么是實(shí)用舶赔?例如:
? ? 1. Paxos 是分布式系統(tǒng)里一個(gè)重要而且實(shí)用的技術(shù)。
? ? 2. Consistent Hash 也是分布式系統(tǒng)里一個(gè)重要而且實(shí)用的技術(shù)谦秧。
? ? 3. MapReduce竟纳、Spark 等等都是很實(shí)用的系統(tǒng)。
? ? 什么不實(shí)用疚鲤? 例如:
? ? Paxos 算法的數(shù)學(xué)證明蚁袭。(注意此處“不實(shí)用” 和 “不重要”的區(qū)別)
? ? 當(dāng)然,分布式系統(tǒng)實(shí)在是一個(gè)太寬泛的話題石咬,本人才疏學(xué)淺揩悄,回答也僅僅可能側(cè)重于我所關(guān)心的領(lǐng)域和方向,很多地方都不能面面俱到鬼悠。所以在此只能拋磚引玉删性, 蜻蜓點(diǎn)水,歡迎大家提出寶貴意見焕窝,我也會(huì)及時(shí)對文章進(jìn)行修改和補(bǔ)充蹬挺。
##分布式系統(tǒng)近些年都在做些什么?
? ? 分布式系統(tǒng)是一個(gè)古老而寬泛的話題它掂,而近幾年因?yàn)?“大數(shù)據(jù)” 概念的興起巴帮,又煥發(fā)出了新的青春與活力。除此之外虐秋,分布式系統(tǒng)也是一門理論模型與工程技法并重的學(xué)科內(nèi)容榕茧。相較于機(jī)器學(xué)習(xí)這樣的研究方向,學(xué)習(xí)分布式系統(tǒng)的同學(xué)往往會(huì)感覺:“入門容易客给,深入難”用押。
? ? 的確,學(xué)習(xí)分布式系統(tǒng)幾乎不需要太多數(shù)學(xué)知識(相比于機(jī)器學(xué)習(xí))靶剑,這也是為什么會(huì)造成 “入門容易” 的錯(cuò)覺蜻拨。然而一旦深入下去,往往需要我們?nèi)ンw會(huì) System 研究的 “簡潔” 與 “美”桩引,正如李沐的回答中說的那樣缎讼,系統(tǒng)工作是 “藝術(shù)” 而不是 “科學(xué)” ,這一點(diǎn)我覺得是系統(tǒng)研究工作最難坑匠,同時(shí)也是最精華的地方血崭。總之把握一點(diǎn)原則:好的系統(tǒng)研究工作,尤其是分布式系統(tǒng)研究功氨,一定是盡可能地用最簡單、最直觀的方法去解決實(shí)際的問題(看看 MapReduce 就知道了)手幢,因?yàn)楹唵尉鸵馕吨鴮?shí)用捷凄。
? ? 總體來說,分布式系統(tǒng)要做的任務(wù)就是把多臺機(jī)器有機(jī)地組合围来、連接起來跺涤,讓其協(xié)同完成一件任務(wù),可以是計(jì)算任務(wù)监透,也可以是存儲任務(wù)桶错。如果一定要給近些年的分布式系統(tǒng)研究做一個(gè)分類的話脾拆,我個(gè)人認(rèn)為大概可以包括三大部分:
? ? 1.? 分布式存儲系統(tǒng)
? ? 2.? 分布式計(jì)算系統(tǒng)
? ? 3.? 分布式管理系統(tǒng)
? ? 近十年來在這三個(gè)方向上见转,毫無疑問, Google 都是開創(chuàng)者尊浓,甚至很多業(yè)內(nèi)人士都說粪狼,這十年是外界追隨谷歌技術(shù)的十年退腥。我們之前說到,分布式系統(tǒng)的研究是一門由實(shí)際問題驅(qū)動(dòng)的研究再榄,而 Google 則是最先需要面對這些實(shí)際問題的公司狡刘。下面我們分別看看這三個(gè)方面工業(yè)界以及學(xué)術(shù)界這幾年都在做些什么。
###分布式存儲系統(tǒng):
? ? 分布式存儲系統(tǒng)是一個(gè)非常古老的話題困鸥,同時(shí)也是分布式系統(tǒng)里最難嗅蔬,最復(fù)雜,涉及面最廣的問題疾就。 往細(xì)了分澜术,分布式存儲系統(tǒng)大概可以分為四個(gè)子方向:
? ? 1.? 結(jié)構(gòu)化存儲
? ? 2.? 非結(jié)構(gòu)化存儲
? ? 3.? 半結(jié)構(gòu)化存儲
? ? 4.? In-memory 存儲
? ? 除了這四個(gè)子方向之外,分布式存儲系統(tǒng)還有一系列的理論猬腰、算法瘪板、技術(shù)作為支撐:例如 Paxos、CAP漆诽、ConsistentHash侮攀、Timing(時(shí)鐘)、2PC厢拭、3PC 等等兰英,這些內(nèi)容我們會(huì)在后面提到。現(xiàn)在供鸠,我們先來看看上述四個(gè)子方向大致都在干些什么畦贸。
? ? 結(jié)構(gòu)化存儲(Structured Storage Systems)的歷史非常古老,典型的場景就是事務(wù)處理系統(tǒng)或者關(guān)系型數(shù)據(jù)庫(RDBMS)。傳統(tǒng)的結(jié)構(gòu)化存儲都是從單機(jī)做起的薄坏,比如大家耳熟能詳?shù)? MySQL趋厉。有句話說:MySQL 的成長史就是互聯(lián)網(wǎng)的成長史。這一點(diǎn)也不為過胶坠。除了 MySQL 之外君账,PostgreSQL 也是近幾年來勢頭非常強(qiáng)勁的一個(gè) RDBMS。我們發(fā)現(xiàn)沈善,傳統(tǒng)的結(jié)構(gòu)化存儲系統(tǒng)強(qiáng)調(diào)的是:(1)結(jié)構(gòu)化的數(shù)據(jù)(例如關(guān)系表)乡数;(2)強(qiáng)一致性 (例如,銀行系統(tǒng)闻牡、電商系統(tǒng)等場景)净赴;(3)隨機(jī)訪問(索引、增刪查改罩润、SQL 語言)玖翅。然而,正是由于這些性質(zhì)和限制割以,結(jié)構(gòu)化存儲系統(tǒng)的可擴(kuò)展性通常都不是很好烧栋,這在一定程度上限制了結(jié)構(gòu)化存儲在大數(shù)據(jù)環(huán)境下的表現(xiàn)。隨著摩爾定律面臨的瓶頸拳球,傳統(tǒng)的單機(jī)關(guān)系型數(shù)據(jù)庫系統(tǒng)面臨著巨大的挑戰(zhàn)审姓。不過真的沒辦法了嗎?在此我們先埋下一個(gè)伏筆:)
? ? 非結(jié)構(gòu)化存儲 (No-structed Storage Systems):和結(jié)構(gòu)化存儲不同的是祝峻,非結(jié)構(gòu)化存儲強(qiáng)調(diào)的是高可擴(kuò)展性魔吐,典型的系統(tǒng)就是分布式文件系統(tǒng)。分布式文件系統(tǒng)也是一個(gè)古老的研究話題莱找,比如 70 年代的 Xerox Alto酬姆、80 年代的 NFS、AFS奥溺、90 年代 xFS 等等辞色。然而,這些早期的分布式文件系統(tǒng)只是起到了網(wǎng)絡(luò)磁盤的作用浮定,其最大的問題就是不支持容錯(cuò) (Fault Tolerance)和錯(cuò)誤恢復(fù) (Fault Recovery)相满。而 Google 在 2003 年 SOSP 上推出的 GFS(Google File System)則是做出了里程碑的一步,其開源實(shí)現(xiàn)對應(yīng)為? HDFS桦卒。GFS 的主要思想包括:
? ? (1)用 Master 來管理 Metadata立美。
? ? (2)文件使用 64MB 的 Chunks 來存儲,并且在不同的 Server 上保存多個(gè)副本方灾。
? ? (3)自動(dòng)容錯(cuò)建蹄,自動(dòng)錯(cuò)誤恢復(fù)碌更。
? ? Google 設(shè)計(jì) GFS 最初的目的是為了存儲海量的日志文件以及網(wǎng)頁等文本信息,并且對其進(jìn)行批量處理(例如配合 MapReduce 為文檔建立倒排索引洞慎,計(jì)算網(wǎng)頁 PageRank 等)痛单。和結(jié)構(gòu)化存儲系統(tǒng)相比,雖然分布式文件系統(tǒng)的可擴(kuò)展性劲腿、吞吐率都非常好旭绒,但是幾乎無法支持隨機(jī)訪問(Random Access)操作,通常只能進(jìn)行文件進(jìn)行追加(Append)操作谆棱。而這樣的限制使得非結(jié)構(gòu)化存儲系統(tǒng)很難面對那些低延時(shí),實(shí)時(shí)性較強(qiáng)的應(yīng)用圆仔。
? ? 半結(jié)構(gòu)化存儲 (Semi-structure Storage Systems)的提出便是為了解決非結(jié)構(gòu)化存儲系統(tǒng)隨機(jī)訪問性能差的問題垃瞧。我們通常會(huì)聽到一些流行的名詞,比如 NoSQL坪郭、Key-Value Store,? 甚至包括對象存儲个从,例如 Protobuf、Thrift 等等歪沃。這些都屬于半結(jié)構(gòu)化存儲研究的領(lǐng)域嗦锐,其中以 NoSQL 近幾年的發(fā)展勢頭尤為強(qiáng)勁。NoSQL 系統(tǒng)既有分布式文件系統(tǒng)所具有的可擴(kuò)展性沪曙,又有結(jié)構(gòu)化存儲系統(tǒng)的隨機(jī)訪問能力(例如隨機(jī) Update奕污、Read 操作),系統(tǒng)在設(shè)計(jì)時(shí)通常選擇簡單鍵值(K-V)進(jìn)行存儲液走,拋棄了傳統(tǒng) RDBMS 里復(fù)雜 SQL 查詢以及 ACID 事務(wù)碳默。這樣做可以換取系統(tǒng)最大限度的可擴(kuò)展性和靈活性。在 NoSQL 里比較有名系統(tǒng)包括:Google 的 Bigtable缘眶、Amazon 的 Dynamo嘱根,以及開源界大名鼎鼎的 HBase、Cassandra 等巷懈。通常這些 NoSQL 系統(tǒng)底層都是基于比較成熟的存儲引擎该抒,比如 Bigtable 就是基于 LevelDB(Jeff dean 寫的,非常好的 C++ 源碼教程)顶燕,底層數(shù)據(jù)結(jié)構(gòu)采用 LSM-Tree凑保,除了 LSM-Tree 之外 B-Tree (B+Tree)也是很成熟的存儲引擎數(shù)據(jù)結(jié)構(gòu)。
? ? In-memory 存儲:隨著業(yè)務(wù)的并發(fā)越來越高涌攻,存儲系統(tǒng)對低延遲的要求也越來越高愉适。 同時(shí)由于摩爾定律以及內(nèi)存的價(jià)格不斷下降,基于內(nèi)存的存儲系統(tǒng)也開始普及癣漆。In-memory 存儲顧名思義就是將數(shù)據(jù)存儲在內(nèi)存中, 從而獲得讀寫的高性能维咸。比較有名的系統(tǒng)包括 Memcahed ,以及 Redis。 這些基于 K-V 鍵值系統(tǒng)的主要目的是為基于磁盤的存儲系統(tǒng)做 Cache癌蓖。還有一些偏向于內(nèi)存計(jì)算的系統(tǒng)瞬哼,比如可以追溯到普林斯頓 Kai Lee 教授早期的研究工作 Distributed Shared Memory ( DSM ),斯坦福的 RamCloud租副,以及最近比較火的基于 Lineage 技術(shù)的 Tachyon(Alluxio)項(xiàng)目(Spark 生態(tài)系統(tǒng)子項(xiàng)目)等等坐慰。
? ? NewSQL:我們在介紹結(jié)構(gòu)化存儲時(shí)說到,單機(jī) RDBMS 系統(tǒng)在可擴(kuò)展性上面臨著巨大的挑戰(zhàn)用僧,然而 NoSQL 不能很好地支持關(guān)系模型结胀。那是不是有一種系統(tǒng)能兼?zhèn)?RDBMS 的特性(例如:完整的 SQL 支持,ACID 事務(wù)支持)责循,又能像 NoSQL 系統(tǒng)那樣具有強(qiáng)大的可擴(kuò)展能力呢糟港? 2012 年 Google 在 OSDI 上發(fā)表的 Spanner,以及 2013 年在 SIGMOD 發(fā)表的 F1院仿,讓業(yè)界第一次看到了關(guān)系模型和 NoSQL 在超大規(guī)模數(shù)據(jù)中心上融合的可能性秸抚。不過由于這些系統(tǒng)都太過于黑科技了,沒有大公司支持應(yīng)該是做不出來的歹垫。比如 Spanner 里用了原子鐘這樣的黑科技來解決時(shí)鐘同步問題剥汤,打破光速傳輸?shù)南拗啤T谶@里只能對 Google 表示膜拜排惨。
? ? 我們在之前提到吭敢,分布式存儲系統(tǒng)有一系列的理論、算法暮芭、技術(shù)作為支撐:例如 Paxos省有、CAP、Consistent Hash谴麦、Timing(時(shí)鐘)蠢沿、2PC、3PC 等等匾效。那么如何掌握好這些技術(shù)呢舷蟀?以我個(gè)人的經(jīng)驗(yàn),掌握這些內(nèi)容一定要理解其對應(yīng)的上下文面哼。什么意思呢野宜?就是一定要去思考為什么在當(dāng)下環(huán)境需要某項(xiàng)技術(shù),如果沒有這個(gè)技術(shù)用其它技術(shù)替代是否可行魔策,而不是一味地陷入大量的細(xì)節(jié)之中匈子。例如:如何掌握好 Paxos?? Paxos 本質(zhì)上來說是一個(gè)三階段提交,更 high level 講是一個(gè)分布式鎖闯袒。理解 Paxos 必須一步一步從最簡單的場景出發(fā)虎敦,比如從最簡單的 Master-backup 出發(fā)游岳,發(fā)現(xiàn)不行;衍生出多數(shù)派讀寫其徙,發(fā)現(xiàn)還是不行胚迫,再到 Paxos。之后再了解其變種唾那,比如 Fast Paxos访锻、Multi-Paxos。同理為什么需要 Consistent Hash闹获,我們可以先思考如果用簡單 Range Partition 劃分?jǐn)?shù)據(jù)有什么問題期犬。再比如學(xué)習(xí) 2PC、3PC 這樣的技術(shù)時(shí)避诽,可以想想他們和 Paxos 有什么關(guān)系龟虎,能否替代 Paxos。
? ? 以上是我關(guān)于分布式存儲系統(tǒng)內(nèi)容的一些總結(jié)茎用,推薦一些相關(guān)的論文 遣总,有興趣的讀者可以看看:
http://www.eecg.toronto.edu/~ashvin/courses/ece1746/2003/reading/ghemawat-sosp03.pdf
http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/ChangFay_etal_OSDI2006.pdf
https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf
http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/Khurana_etal_2012.pdf
http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/Abadi_2012.pdf
https://www.usenix.org/conference/osdi12/technical-sessions/presentation/corbett
https://www.cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf
https://homes.cs.washington.edu/~billhowe/mapreduce_a_major_step_backwards.html
http://lintool.github.io/UMD-courses/bigdata-2015-Spring/content/Stonebraker_etal_CACM2010.pdf
http://www.cs.cmu.edu/~pavlo/courses/fall2013/static/slides/mapreduce.pdf
##分布式計(jì)算系統(tǒng)
? ? 聊完了分布式存儲系統(tǒng)睬罗,讓我們來聊聊分布式計(jì)算系統(tǒng) :) 首先解決一個(gè)很多初學(xué)分布式計(jì)算的同學(xué)的疑惑:分布式計(jì)算和并行計(jì)算是一回事嗎轨功?最初我也有這樣的疑惑,而現(xiàn)在我的理解是這樣的:
傳統(tǒng)的并行計(jì)算要的是:投入更多機(jī)器容达,數(shù)據(jù)大小不變古涧,計(jì)算速度更快。
分布式計(jì)算要求:投入更多的機(jī)器花盐,能處理更大的數(shù)據(jù)羡滑。
? ? 換句話說二者的出發(fā)點(diǎn)從一開始就不同,一個(gè)強(qiáng)調(diào) High Performance, 一個(gè)強(qiáng)調(diào) Scalability算芯。舉例來說柒昏,MapReduce 給業(yè)界帶來的真正思考是什么?其實(shí)是給我們普及了 Google 這樣級別的公司對真正意義上的「大數(shù)據(jù)」的理解熙揍。因?yàn)樵?04 年論文出來之前职祷,搞并行計(jì)算的人壓根連 「容錯(cuò)」的概念都沒有。換句話說届囚,分布式計(jì)算最為核心的部分就是「容錯(cuò)」有梆,沒有容錯(cuò),分布式計(jì)算根本無從談起意系。MapReduce 統(tǒng)要做成這個(gè)樣子(Map + Reduce)泥耀,其實(shí)就是為了容錯(cuò)。
? ? 然而很多初學(xué)分布式計(jì)算的同學(xué)對容錯(cuò)的概念多多少少是有誤解的蛔添。包括我在初學(xué) MapReduce 的時(shí)候也會(huì)思考:好好的計(jì)算怎么就會(huì)出錯(cuò)了呢痰催?一方面兜辞,由于硬件的老化,有可能會(huì)導(dǎo)致某臺存儲設(shè)備沒有啟動(dòng)起來陨囊,某臺機(jī)器的網(wǎng)卡壞了弦疮,甚至于計(jì)算運(yùn)行過程中斷電了,這些都是有可能的蜘醋。然而最頻繁發(fā)生的錯(cuò)誤是計(jì)算進(jìn)程被殺掉胁塞。因?yàn)?Google 的運(yùn)行環(huán)境是共有集群,任何一個(gè)權(quán)限更高的進(jìn)程都可能 Kill 掉你的計(jì)算進(jìn)程压语。設(shè)想在一個(gè)擁有幾千臺機(jī)器的集群中運(yùn)行啸罢,一個(gè)進(jìn)程都不被 Kill 掉的概率幾乎為零。具體的容錯(cuò)機(jī)制我們會(huì)在后面介紹具體的系統(tǒng)時(shí)提到胎食。
? ? 另一個(gè)有意思的話題是扰才,隨著機(jī)器學(xué)習(xí)技術(shù)的興起,越來越多的分布式計(jì)算系統(tǒng)是為了機(jī)器學(xué)習(xí)這樣的應(yīng)用設(shè)計(jì)的厕怜,這也是我比較關(guān)注的研究領(lǐng)域衩匣,也會(huì)在后面重點(diǎn)談到。
? ? 如同分布式存儲系統(tǒng)一樣粥航,我對分布式計(jì)算系統(tǒng)也做了一個(gè)分類琅捏,如下:
1.? 傳統(tǒng)基于 MSG 的系統(tǒng)
2.? MapReduce-like 系統(tǒng)
3.? 圖計(jì)算系統(tǒng)
4.? 基于狀態(tài)(State)的系統(tǒng)
5.? Streaming 系統(tǒng)
? ? 當(dāng)然不同的人可能會(huì)有不同的分類方法,不過大同小異递雀。我們接下來聊聊這些系統(tǒng)都在干些什么柄延。
? ? 傳統(tǒng)基于MSG的系統(tǒng):這類系統(tǒng)里比較有代表性的就是 MPI (Message Passing Interface)。目前比較流行的兩個(gè) MPI 實(shí)現(xiàn)是 MPICH2 和 OpenMPI缀程。MPI 這個(gè)框架非常靈活搜吧,對程序的結(jié)構(gòu)幾乎沒有太多約束,以至于大家有時(shí)把 MPI 稱為一組接口 API, 而不是系統(tǒng)框架杨凑。在這些 API 里最常用的兩個(gè)就是 send 和 recv 接口(還有一系列非阻塞擴(kuò)展接口滤奈,例如:Isend、Irecv 等)撩满。MPI 除了提供消息傳遞接口之外蜒程,其框架還實(shí)現(xiàn)了資源管理和分配,以及調(diào)度的功能鹦牛。除此之外搞糕,MPI 在高性能計(jì)算里也被廣泛使用,通陈罚可以和 Infiniband 這樣的高速網(wǎng)絡(luò)無縫結(jié)合窍仰。
? ? 除了 send 和 recv 接口之外,MPI 中另一個(gè)接口也值得注意礼殊,那就是 AllReduce驹吮。這個(gè)接口在很多機(jī)器學(xué)習(xí)系統(tǒng)開發(fā)里都很用针史。因?yàn)楹芏嗖⑿袡C(jī)器學(xué)習(xí)系統(tǒng)都是各個(gè)進(jìn)程分別訓(xùn)練模型,然后在合適的時(shí)候(例如一輪迭代結(jié)束)大家同步一下答案碟狞,達(dá)成共識啄枕,然后繼續(xù)迭代。這個(gè) “達(dá)成共識” 的操作往往可以很方便地通過 AllReduce 來完成族沃。 AllReduce 接口具有兩個(gè)優(yōu)點(diǎn):高效和使用簡單频祝。 先說說為什么使用簡單:使用 AllReduce 通常只需要在單機(jī)核心源碼里加入? AllReduce 一行代碼,就能完成并行化的功能脆淹。說 AllReduce 高效的原因是因?yàn)槠涞讓酉鬟f使用了 Tree Aggregation常空,盡可能地將計(jì)算分?jǐn)偟矫恳粋€(gè)節(jié)點(diǎn)。
? ? 可是盖溺,既然 AllReduce 這么好漓糙,為什么在實(shí)際大規(guī)模計(jì)算中很少看到呢?原因很簡單烘嘱,就是因?yàn)? MPI 不支持容錯(cuò)昆禽,所以很難擴(kuò)展到大規(guī)模集群之上。不過最近陳天奇寫了一個(gè)支持容錯(cuò)的 AllReduce 接口蝇庭,叫 Rabit醉鳖,有興趣的同學(xué)可以關(guān)注一下。 大名鼎鼎的 XGBoost 底層的分布式接口就是 Rabit遗契。
? ? MapReduce-like 系統(tǒng):這一類系統(tǒng)又叫作 Dataflow 系統(tǒng)辐棒,其中以 MapReduce(Hadoop)和 Spark 為代表病曾。其實(shí)在學(xué)術(shù)界有很多類似的系統(tǒng)例如 Dryad牍蜂、FlumeJava、Twister 等等泰涂。這一類系統(tǒng)的特點(diǎn)是將計(jì)算抽象成為 High-Level Operator鲫竞,例如像 Map、Reduce逼蒙、Filter 這樣的函數(shù)式算子从绘,然后將算子組合成 DAG ,然后由后端的調(diào)度引擎進(jìn)行并行化調(diào)度是牢。其中僵井,MapReduce 系統(tǒng)屬于比較簡單的 DAG,只有 Map 和 Reduce 兩層節(jié)點(diǎn)驳棱。MapReduce 這樣的系統(tǒng)之所以可以擴(kuò)展到超大規(guī)模的集群上運(yùn)行批什,就是因?yàn)槠渫陚涞娜蒎e(cuò)機(jī)制。在 Hadoop 社區(qū)還有很多基于 MapReduce 框架的衍生產(chǎn)品社搅,比如 Hive(并行數(shù)據(jù)庫 OLAP)驻债、Pig(交互式數(shù)據(jù)操作)等等乳规。
? ? MapReduce-like 的編程風(fēng)格和 MPI 截然相反。MapReduce對程序的結(jié)構(gòu)有嚴(yán)格的約束——計(jì)算過程必須能在兩個(gè)函數(shù)中描述:Map 和 Reduce合呐;輸入和輸出數(shù)據(jù)都必須是一個(gè)一個(gè)的 Records暮的;任務(wù)之間不能通信,整個(gè)計(jì)算過程中唯一的通信機(jī)會(huì)是 Map Phase 和 Reduce Phase 之間的 Shuffuling Phase淌实,這是在框架控制下的冻辩,而不是應(yīng)用代碼控制的。因?yàn)橛辛藝?yán)格的控制拆祈,系統(tǒng)框架在任何時(shí)候出錯(cuò)都可以從上一個(gè)狀態(tài)恢復(fù)微猖。Spark 的 RDD 則是利用 Lineage,可以讓數(shù)據(jù)在內(nèi)存中完成轉(zhuǎn)換缘屹。
? ? 由于良好的擴(kuò)展性凛剥,許多人都將機(jī)器學(xué)習(xí)算法的并行化任務(wù)放在了這些平臺之上。比較有名的庫包括 Mahout(基于 Hadoop)轻姿,以及 MLI (基于 Spark) 犁珠。然而這些系統(tǒng)最大缺點(diǎn)有兩點(diǎn):
1. 這些系統(tǒng)所能支持的機(jī)器學(xué)習(xí)模型通常都不是很大。導(dǎo)致這個(gè)問題的主要原因是這系統(tǒng)在 push back 機(jī)器學(xué)習(xí)模型時(shí)都是粗粒度地把整個(gè)模型進(jìn)行回傳互亮,導(dǎo)致了網(wǎng)絡(luò)通信的瓶頸犁享。有些機(jī)器學(xué)習(xí)的模型可以大到無法想象,比如我們用 Field-aware Factorization Machine (FFM)做? Criteo 的 CTR Prediction 時(shí)模型大小可以達(dá)到 100 GB.
2. 嚴(yán)格的 BSP 同步計(jì)算使得集群的效率變得很低豹休。也就是說系統(tǒng)很容易受到 straggle 的影響炊昆。
? ? 圖計(jì)算系統(tǒng):圖計(jì)算系統(tǒng)是分布式計(jì)算里另一個(gè)分支,這些系統(tǒng)都是把計(jì)算過程抽象成圖威根,然后在不同節(jié)點(diǎn)分布式執(zhí)行凤巨,例如 PageRank 這樣的任務(wù),很適合用圖計(jì)算系統(tǒng)來表示洛搀。最早成名的圖計(jì)算系統(tǒng)當(dāng)屬 Google? 的 Pregel敢茁,該系統(tǒng)采用 BSP 模型,計(jì)算以 Vectex 為中心留美。隨后又有一系列圖計(jì)算框架推出彰檬,例如:GPS (對 Pregel 做了優(yōu)化,除了 Vectex-centric Computation谎砾,還有 Global Computation逢倍,動(dòng)態(tài)調(diào)整分區(qū)等等。)Giraph / Hama 都是基于 Hadoop 的 Apache 的開源 BSP 圖計(jì)算項(xiàng)目景图。
? ? 除了同步(BSP)圖計(jì)算系統(tǒng)之外较雕,異步圖計(jì)算系統(tǒng)里的佼佼者當(dāng)屬 GraphLab,該系統(tǒng)提出了 GAS 的編程模型症歇。目前這個(gè)項(xiàng)目已經(jīng)改名為 Dato郎笆,專門推廣基于圖的大規(guī)模機(jī)器學(xué)習(xí)系統(tǒng)谭梗。
? ? 基于狀態(tài)(State)的系統(tǒng):這一類系統(tǒng)主要包括 2010 年 OSDI 上推出的 Piccolo,以及后來 2012 年 NIPS 上 Google 推出的 DistBelief宛蚓,再到后來被機(jī)器系學(xué)習(xí)領(lǐng)域廣泛應(yīng)用的 Parameter Server 架構(gòu)激捏。這里我們重點(diǎn)介紹一下 Parameter Server 這個(gè)架構(gòu)。
? ? 我們之前說凄吏,MPI 由于不支持容錯(cuò)所以很難擴(kuò)展至大規(guī)模集群之中远舅;MapReduce 系統(tǒng)無法支持大模型機(jī)器學(xué)習(xí)應(yīng)用,并且節(jié)點(diǎn)同步效率較低痕钢。用圖抽象來做機(jī)器學(xué)習(xí)任務(wù)图柏,很多問題都不能很好地求解,比如深度學(xué)習(xí)中的多層結(jié)構(gòu)任连。而 Parameter Server 這種 State-Centric 模型則把機(jī)器學(xué)習(xí)的模型存儲參數(shù)上升為主要組件蚤吹,并且采用異步機(jī)制提升處理能力。參數(shù)服務(wù)器的概念最早來自于 Alex Smola 于 2010 年提出的并行? LDA 架構(gòu)随抠。它通過采用分布式的 Memcached 作為存放參數(shù)的存儲裁着,這樣就提供了有效的機(jī)制作用于不同Worker節(jié)點(diǎn)同步模型參數(shù)。Google 的 Jeff Dean 在 2012 年進(jìn)一步提出了第一代 Google Brain 大規(guī)模神經(jīng)網(wǎng)絡(luò)的解決方案 Distbelief拱她。后來? CMU? 的 Eric xing 以及百度少帥李沐都提出了更通用的 Parameter server 架構(gòu)二驰。
? ? 如果要深入 Parameter Server 系統(tǒng)的設(shè)計(jì),需要一些機(jī)器學(xué)習(xí)的背景秉沼,比如什么是 SSP? 協(xié)議桶雀, 在此我們就不詳細(xì)討論了。
? ? Streaming 系統(tǒng):Streaming 系統(tǒng)聽名字就能看出來是為流式數(shù)據(jù)提供服務(wù)的唬复。其中比較有名的系統(tǒng)包括 Storm矗积、Spark Streaming、Flink 等等盅抚。由于本人對這個(gè)領(lǐng)域并不是很熟漠魏,就不詳細(xì)介紹了倔矾。
? .以上是我對分布式計(jì)算系統(tǒng)的一些介紹妄均,其實(shí)每一個(gè)方向深入下去都是一個(gè)研究領(lǐng)域,在此推薦一些論文:
MapReduce: Simplified Data Processing on Large Clusters
Resilient Distributed Datasets
Scaling Distributed Machine Learning with the Parameter Server
Distributed GraphLab: A Framework for Machine Learning
Piccolo: Building Fast, Distributed Programs with Partitioned ..
Petuum: A New Platform for Distributed Machine Learning on Big Data
Spark Streaming
Dryad: Distributed Data-parallel Programs from Sequential Building ...
Large Scale Distributed Deep Networks - NIPS Proceedings