微軟發(fā)布學(xué)術(shù)版分布式計(jì)算技術(shù)Dryad和DryadLINQ
Dryad和DryadLINQ是微軟硅谷研究院創(chuàng)建的研究項(xiàng)目,旨在提供一個(gè)分布式計(jì)算平臺(tái),近年來(lái)這個(gè)平臺(tái)已經(jīng)在微軟內(nèi)部得以廣泛使用(如微軟AdCenter中的數(shù)據(jù)分析)。在近日舉行的微軟2009年研究院教員峰會(huì)上,微軟發(fā)布了Dryad/DryadLINQ的學(xué)術(shù)版,以及Trident項(xiàng)目(一個(gè)基于Dryad/DryadLINQ及微軟其他一些技術(shù)的科研工作流平臺(tái))的CTP版本。
Dryad是微軟分布式并行計(jì)算基礎(chǔ)平臺(tái),使程序員可以利用數(shù)據(jù)中心的服務(wù)器集群對(duì)數(shù)據(jù)進(jìn)行并行處理。Dryad程序員在操作數(shù)千臺(tái)機(jī)器時(shí),無(wú)需關(guān)心并行處理的細(xì)節(jié)。據(jù)Dryad論文描述:
Dryad被設(shè)計(jì)為伸縮于各種規(guī)模的計(jì)算平臺(tái):從單臺(tái)多核計(jì)算機(jī)、到由幾臺(tái)計(jì)算機(jī)組成的小型集群,直至擁有數(shù)千臺(tái)計(jì)算機(jī)的數(shù)據(jù)中心。Dryad執(zhí)行引擎負(fù)責(zé)處理大型分布式、并行應(yīng)用程序中會(huì)出現(xiàn)的各種難題:對(duì)計(jì)算機(jī)和它們的CPU進(jìn)行調(diào)度,從通信或計(jì)算機(jī)的失敗中恢復(fù),以及數(shù)據(jù)在節(jié)點(diǎn)之間的傳遞等等。
DryadLINQ的目標(biāo)是提供一種高級(jí)語(yǔ)言接口,使普通程序員可以輕易進(jìn)行大規(guī)模的分布式計(jì)算,它結(jié)合了微軟Dryad和LINQ兩種關(guān)鍵技術(shù)。
LINQ的理念為“代碼即數(shù)據(jù)(treat code as data)”。如上圖所示,DryadLINQ可以根據(jù)程序員給出的LINQ查詢生成可以在Dryad引擎上執(zhí)行的分布式運(yùn)算規(guī)則,并負(fù)責(zé)任務(wù)的自動(dòng)并行處理及數(shù)據(jù)傳遞時(shí)所需要的序列化等操作。此外,它還提供了一系列易于使用的高級(jí)特性,如強(qiáng)類型數(shù)據(jù),Visual Studio集成調(diào)試,以及豐富的任務(wù)優(yōu)化規(guī)則等等。以下是使用DryadLINQ獲取一個(gè)柱狀圖所需數(shù)據(jù)的方式(引用自微軟發(fā)布的示例代碼):
- static IQueryable<Pair> Histogram(IQueryable<string> input, int k)
- {
- IQueryable<string> words = input.SelectMany(x => x.Split(' '));
- IQueryable<IGrouping<string, string>> groups = words.GroupBy(x => x);
- IQueryable<Pair> counts = groups.Select(x => new Pair(x.Key, x.Count()));
- IQueryable<Pair> ordered = counts.OrderByDescending(x => x.count);
- IQueryable<Pair> top = ordered.Take(k);
- return top;
- }
談到大規(guī)模分布式計(jì)算技術(shù),便不得不提起著名的Google MapReduce。據(jù)DryadLINQ論文(該論文獲得OSDI 08最佳論文獎(jiǎng))所述,DryadLINQ與MapReduce的區(qū)別在于:
MapReduce同樣提供了能夠快速進(jìn)行編程的簡(jiǎn)化抽象,但是,使用這種編程模型來(lái)實(shí)現(xiàn)一些最常見的操作,如數(shù)據(jù)庫(kù)Join都要使用較為有技巧(tricky)的做法。還有,我們經(jīng)常需要把MapReduce計(jì)算嵌入一種腳本語(yǔ)言來(lái)實(shí)現(xiàn)多次歸并或排序操作。每個(gè)MapReduce階段(stage)都是自治的(self-contained),因此無(wú)法跨越邊界進(jìn)行優(yōu)化。此外,缺少類型系統(tǒng)來(lái)連接不同的MapReduce階段,迫使程序員必須顯式跟蹤階段間傳遞的對(duì)象,這導(dǎo)致軟件長(zhǎng)期維護(hù)以及組件的復(fù)用變得麻煩。
因此,出現(xiàn)了一些構(gòu)建于MapReduce抽象上的DSL為程序員隱藏了一些復(fù)雜性,如Sawzall、Pig、以及其他一些未發(fā)表的系統(tǒng),如Facebook的HIVE。這些DSL簡(jiǎn)單地結(jié)合了聲明式與命令式的編程方式,并生成類似SQL存儲(chǔ)過(guò)程的模型,這樣便可以對(duì)跨越MapReduce階段的邊界進(jìn)行一些整體的自動(dòng)優(yōu)化。然而,這些做法也帶來(lái)了一些SQL的缺點(diǎn),如過(guò)于簡(jiǎn)單的自定義類型系統(tǒng),以及有限的交互式計(jì)算能力。它們提供的優(yōu)化不如DryadLINQ來(lái)的有效,一部分原因在于Dryad比MapReduce執(zhí)行平臺(tái)的靈活性要高的多。
此外,微軟發(fā)布的Trident項(xiàng)目是一個(gè)科學(xué)工作流控制臺(tái),為科學(xué)家們提供了一個(gè)靈活而強(qiáng)大的方式,可以對(duì)大規(guī)模的,變化紛繁的數(shù)據(jù)集進(jìn)行分析。它提供了可視化工具來(lái)創(chuàng)建、管理和分享工作流,并且可以在Windows HPC Server 2008集群上執(zhí)行這些工作流。Trident基于Dryad/DryadLINQ和WF開發(fā),并提供了WPF和Siverlight兩種版本的可視化界面。開發(fā)人員還可以擴(kuò)展Trident,并與Word,SQL Server,Data Service等多種技術(shù)進(jìn)行集成,使Trident的適用范圍更為廣泛。
【編輯推薦】