CG_Hadoop:基於MapReduce的計算幾何

GeoWin_CAS發表於2014-12-26

原作:Ahmed Eldawy;Mohamed F.Mokbel (UMN)

翻譯:Leo(CAU)

注:由於本人翻譯水平有限,如有錯誤,敬請諒解,可以在評論中指出,歡迎交流!

摘要:Hadoop使用了MapReduce程式設計正規化,目前已經被公認為是分散式環境中分析大資料的標準框架。然而,它並不能很好的應用於大規模的計算幾何處理。本文介紹的CG_Hadoop是一套可伸縮的和高效的MapReduce演算法,用於處理各種基本計算幾何問題,例如多邊形合併、skyline(輪廓線)、convex hull(凸包)、farthest pair(最遠相對)以及最近相對等,這些都是其它幾何演算法的基礎。對於每一個計算幾何操作,CG_Hadoop有兩個版本,一個基於Apache Hadoop系統,一個基於SpatialHadoop系統。CG_Hadoop更適合空間操作。這些提出的演算法形成了一個全面的計算幾何操作MapReduce庫。大量的實驗結果表明CG_Hadoop達到了29倍和260倍,比使用Hadoop和SpatialHadoop都具有更好的效能。試驗採用25臺機器組成的叢集,資料集大小為128GB。

1、引言

   Hadoop[17]是在分散式環境下高效處理大量資料的一個框架,採用了MapReduce程式設計正規化,是通過兩個函式,即Map和Reduce,進行的並行程式。Map函式將單一資料記錄對映為一組key/Value組對<k,v>,而Reduce函式是將同一Key值的所有Value中取出併產生最終結果。MapReduce正規化的簡便性和靈活性使得Hadoop能夠應用在一些大規模的應用中,如機器學習[13],兆位元組檔案排序[29]以及影像處理[14]等。

   與此同時,隨著裝置和應用程式的大量出現,也產生了巨量的空間資料,例如智慧手機、空間望遠鏡[6]和社交工具[28,35]等。如此大量的空間資料需要充分利用MapReduce程式設計正規化[11]的優勢去解決各種空間操作。在計算幾何演算法中,最重要的空間操作就是對空間範圍內的幾何實體進行表達和操作。這些操作包括:多邊形合併、skyline(輪廓線)、convex hull(凸包)、farthest pair( 最遠相對)以及最近相對等。這對這些問題儘管已經存在了很多優秀的計算幾何演算法,但是,這些演算法並不能很好的處理包含數億點的現有空間資料集。例如,計算4億個點資料集的凸多邊形,如果採用傳統的方法可能需要花費三個小時,計算合併500萬個多邊形需要花費1個小時,對於更大的資料集可能會出現記憶體溢位,計算失敗。

 本文介紹的CG_Hadoop,具有一系列可伸縮而且效率高的MapReduce演算法用於解決各種基礎計算幾何問題,如polygonunion, skyline ,convex hull,farthest pair, and closest pair等,這些演算法都是其他幾何計算的基礎[5,33]。CG_Hadoop與傳統的計算地理演算法相比,在處理大尺度空間資料時表現更好的效能。針對每一個計算幾何演算法,本文都介紹了CG_Hadoop的兩個版本,一個基於Apache Hadoop系統部署[17],另外一個基於開源的SpatialHadoop進行部署[12]。前者是一個開源的MapReduce專案,已經廣泛應用於MapReduce應用[9,13,14,19,20,29]。後者是一個基於Hadoop系統進行了封裝,採用了空間索引,使其更適合空間操作。

  在CG_Hadoop中所有演算法的主要思想是充分利用許多計算幾何演算法分而治之的思想。分而治之的特性適合MapReduce環境,該環境是在一個計算機器叢集中多個節點並行處理。因此,在MapReduce環境中,CG_Hadoop必須適應傳統計算演算法來更好的工作。例如,不想傳統演算法那樣將輸入資料一分為二進行多次計算,而CG_Hadoop將輸入劃分為更小的組塊,確保在每一個MapReduce中都被計算出結果,這樣對於Hadoop和SpatialHadoop來說都比較適合。另外,本文采用了SpatialHadoop中分散式空間索引,通過先將輸入分塊但不會影響計算幾何操作的結果,只要有可能,加快計算的速度,。

   CG_Hadoop是SpatialHadoop(http://spatialhadoop.cs.umn.edu/)可用程式碼的一部分,形成了計算幾何操作中綜合MapReduce的核心部分。CG_Hadoop具有開源性質,將作為一個研究載體供其他研究者建立更多的基於MapReduce程式設計正規化的計算幾何演算法。實驗環境使用25臺機器的一個叢集,真實資料和合成的資料多達128GB,實驗表明基於Hadoop和SpatialHadoop的CG_Hadoop比傳統的演算法達到了29倍和260倍,都具有更好的效能。

   本文剩餘內容組織如下。第二節簡單介紹了所需環境。從第3節到第7節分別介紹了基於MapReduce的各種演算法操作,包括多邊形合併,Skyline,凸多邊形,最遠組對和最近組對。第8節進行了實驗評價。第9節進行了討論。最後一節是本文的結論。

2、背景

   本章節給出了關於Hadoop和SpatialHadoop兩個系統的背景資訊。CG_Hadoop中一系列的計算幾何操作同時在這兩個平臺上使用。

2.1 Hadoop

   Hadoop[17]是一個基於大叢集進行資料處理的開源框架。一個Hadoop叢集包含了一個主節點和幾個從節點。主節點儲存檔案的元資訊(如名稱和訪問許可權等),而從幾點儲存了檔案中實際的資料(如記錄等)。一個檔案在處理之前,一般是被切分為64M(稱之為塊)的大塊,然後載入到Hadoop分散式檔案系統(HDFS)上。主節點將跟蹤檔案如何被分塊和每一塊儲存的位置,而從節點儲存資料塊。類比普通的檔案系統,主節點儲存檔案配置表和索引節點,從節點儲存檔案資料。

  MapReduce程式配置一個MapReduce工作並將其提交給主節點。一個MapReduce工作包含一系列配置引數,如Map函式和輸入檔案等。主節點將這個工作分為幾個Map任務,然後分解這些任務並在每一個從節點上執行每一個任務。這也將輸入的檔案分塊,然後分配每快給一個從節點去作為一個Map任務去處理。Map任務通過配置的記錄讀取函式解析配置塊,然後生成一系列的Key-value組對<k1,v1>,這些組對會通過Map函式生成一系列中間組對<k2,v2>。中間組對通過K2進行分組,然後reduce函式收集所有同一關鍵值的中間記錄,然後經過處理生成最終記錄<k3,v3>集,並將其儲存在HDFS檔案中。

   MapReduce和Hadoop已經被許多主流的公司使用,如Google[11]、Yahoo![9]、微軟的Dryad[19],以及Twitter[20]。同時在一些大規模的應用中也很受歡迎,如機器學習[13],兆位元組檔案排序[29]以及影像處理[14]等。

2.2 SaptialHadoop

  SpatialHadoop是基於Hadoop的一個全面擴充套件,能夠實現空間操作的高效處理。重要的是,SpatialHadoop在Hadoop儲存層提供了兩層空間索引,實現了基於格網檔案[26]、R-tree[16]索引。豐富了MapReduce層,嵌入了兩個新的元件,在該層允許使用空間索引。SpatialHadoop通過建立索引來提高一些空間操作的演算法效率。

   SpatialHadoop的空間索引包括一個全域性索引和多個區域性索引。全域性索引通過叢集節點資料劃分資料,而區域性索引在每一個節點內部組織資料。在MapReduce層新嵌入的元件通過全域性和區域性索引來修剪檔案的分割槽和記錄,但不會影響操作結果。修剪的標準取決於用於定義的過濾功能,這個可以通過MapReduce程式來提供。

2.3 計算幾何操作

  正如上文所述,CG_Hadoop形成了計算幾何操作的全面MapReduce庫的核心部分。目前,CG_Hadoop包括5個基礎的操作,即合併、Skyline、凸多邊形、Farthest pair、和closest pair。下面對他們進行簡單的定義。


合併:對一組多邊形集合S進行合併,就是集合S中至少一個多邊形內部所有點集合,僅僅保留所有點中的邊界點,刪除內部的所有點。圖1(a)給出了一個示例對輸入的多邊形進行合併作為一組壓縮程式碼區域,圖1(b)是合併的結果。

Skyline(輪廓):例如圖1中的點集合P。如果點Pi的座標至少在一個維度(縱座標或橫座標)不小於Pj的座標,那麼Pi在點P集合中就主導點Pj。點集合P的輪廓線是有這些主導點構成的(如圖1(d))。在計算幾何領域,輪廓線通常被稱之為最大點集合[33]。

ConvexHull(凸包):一個點集合P的凸包是指包含這些點的最小凸多邊形,如圖1(e)所示。凸包操作的輸出就是所有點按照順時針的方向形成凸包(MRB)。

FarthestPair:給定一組點P,最遠組對是所有點對中,兩點之間的歐幾里得距離最大的一對點。如圖1(e)所示,最遠的一對點在凸包上。

ClosestPair:給定一個組點P,最近組對是所有點對中,兩點之間的歐幾里得距離最小的一對點。如圖1(e)所示。

3、合併

   傳統演算法為多邊形合併操作[33]計算兩個多邊形的合併通過計算所有邊緣交叉,刪除所有內部部分,僅留下週邊的部分。對於兩個以上的多邊形合併,首先合併兩個多邊形,然後與下一個多邊形合併直到所有的多邊形都合併成一個多邊形。PostGIS[32]中,通過以下SQL查詢語句來執行這個操作,每一列geom儲存了每一個ZIP程式碼的多邊形資訊。

SELECT ST_Union(zip_codes.geom)FROM zip_codes;


   本節介紹了基於Hadoop和SpatialHadoop的兩個多邊形合併演算法。以圖1(a)中的資料集作為輸入。為了便於說明,同時保持代表性,例項中的多邊形不存在重疊現象。

3.1 Hadoop中的合併

   Hadoop中多邊形合併演算法核心思想是允許每一臺機器累加多邊形的子集,然後讓一臺機器將所有機器的結果都收集起來並計算出最終答案。演算法步驟如下:分割槽、區域性分割槽和全域性分割槽。第一步分割槽是將輸入的多邊形分為更小的子集儲存在每一臺機器上。該步驟由Hadoop載入檔案命令執行,可以將檔案劃分為64MB大小的組塊儲存在每一個從節點上。第二步是建立區域性索引。每一臺機器通過傳統的記憶體中多邊形合併演算法計算該機器上多邊形合併。因為每一個資料塊最大為64MB,所以記憶體演算法實現跟輸入檔案的大小無關。這些步驟作為一個聯合功能再Hadoop中實現,執行在每一臺機器中。當執行完區域性合併之後,每一臺機器會生成一組多邊形作為該機器上分配的所有多邊形的合併結果。全域性合併在Hadoop中是以reduce功能來實現的,這個過程是在一臺機器上計算最終的而結果。Reduce函式取出所有區域性計算的合併結果,然後合併成一個,對他們再通過傳統的記憶體計算演算法進行合併。每一臺機器最終將生成只有幾個多邊形,這樣可以使用記憶體演算法進行多邊形合併。

  通過充分利用並行機器的優勢,而不是在一臺機器上完成所有的工作,本文提出的演算法與傳統的演算法相比具有明顯的優勢。儘管將資料分配到每臺機器上,再從每一臺機器上搜尋結果都會有所開銷,這樣的開銷可以通過並行機器的成本抵消掉,而且也可以用來處理更大尺度的空間資料集。對於更感興趣,而且也比較熟悉MapReduce程式設計正規化的讀者,附件A.1.給出了基於Hadoop的多邊形合併演算法的原始碼。

   圖2給出了圖1(a)的輸入資料集通過四個叢集計算節點進行分割槽和區域性合併的過程,四個節點每一個多邊形分配到一個節點。決定哪個節點屬於哪個分割槽完全取決於Hadoop負載檔案元件,基本上是隨機分配多邊形到每一個節點上。

  通過圖中的結果,可以發現分配到一個節點的多邊形合併後完全保持獨立。在這種情況下,素有的多邊形都作為輸出結果。然後,所有節點的輸出結果將通過一個單獨的機器進行計算得出最終的答案,如圖1(b)所示。

3.2 SpatialHadoop中的合併

  SpatialHadoop中多邊形合併演算法和Hadoop中的演算法具有一樣的三個步驟。唯一不同的地方是在SpatialHadoop中進行資料集分塊含有一種空間思想的行為,如圖3所示,相鄰的多邊形被分配在了一臺機器上。這主要是因為在SpatialHadoop中利用了潛在的空間索引結構去為每個節點分配多邊形。尤其是,在SpatialHadoop中採用R-tree索引,每一個R-tree節點的大小為64MB,每一個叢集節點儲存每一個R-tree節點中的所有條目。因此,根據定義,每一個R-tree節點提供一簇相鄰的多邊形,特別是,在SpatialHadoop中所有R-trees批量載入也能夠保證同一個節點上的所有多邊形是相鄰的。

  儘管區域性和全域性合併步驟一樣,但在SpatialHadoop中變的更加簡潔。其區域性合併通常生成輸出一個多邊形,而在Hadoop中往往輸出多個多邊形。在本文的例項中,通過Hadoop的區域性合併後生成了28個多邊形,而在SpatialHadoop中僅僅生成了4個多邊形,這就使得最終的演算法計算的更快。SpatialHadoop中多邊形合併演算法的原始碼完全和Hadoop中一樣(附件A.1.)。

4、Skyline(輪廓線)

   傳統的記憶體中二維輪廓演算法是採用分而治之的思想,首先將所有點按照X座標進行排序,並通過一條垂直線將所有點分為兩個大小相等的子集。每一半的輪廓通過遞迴計算,最終的輪廓線通過兩者合併計算得到。合併兩條輪廓線,左邊輪廓線的點按照非遞減X順序進行掃描,也就是按照非遞增Y順序進行掃描,每一個都和右邊輪廓線最左邊的點進行比較。一旦左邊軌跡線的點佔優勢,那麼就刪除掉左邊輪廓線上的所有後續點,兩條輪廓線上剩餘的點連結在一起。在資料庫管理系統中是不支援輪廓線操作符的。然而,在資料庫中這些主要基於磁碟的演算法具有非常大的意義(例如[7, 31])通過非標準SQL查詢。

SELECT * FROM points SKYLINEOF d1 MAX, d2 MAX;

    本節介紹了兩種輪廓線演算法,一種基於Hadoop,一種基於SpatialHadoop。以圖1(c)中的資料為輸入資料集。

4.1 Hadoop中的Skyline

   本文Hadoop中的skyline演算法是傳統分而治之skyline演算法的一種演變[33],是將輸入的資料劃分為多個(多於兩個)部分,每一部分可以通過一臺機器來處理。通過這樣的方式,輸入的資料通過所有機器需要一次被劃分,確保結果能夠在一次MapReduce迭代過程中得到。類似於Hadoop多邊形合併演算法,Hadoop輪廓線演算法分為三步來執行:劃分、區域性輪廓線和全域性輪廓線。劃分步驟將輸入的資料集劃分為64MB大小的更小組塊,並將它們分配到每一臺機器上。區域性輪廓線步驟是指每一臺機器通過傳統的演算法計算本機器上的資料組塊輪廓線,僅輸出非主導地位的點。最終通過全域性輪廓線步驟,一臺機器收集所有區域性輪廓線的點,然後計算這些點的最終輪廓線。值得注意的是,不能夠通過記憶體演算法來進行合併這些區域性輪廓線,因為區域性輪廓線不是通過一條垂直線進行分開的,實際上他們之間有可能重疊。通過Hadoop劃分資料塊是隨機劃分的,並沒有考慮資料之間的空間位置。全域性輪廓線步驟計算最終的結果,通過傳統的輪廓線演算法將區域性輪廓線中的所有點合併成一個要素集。熟悉MapReduce程式設計的使用者可以參考附件A.2的原始碼。

   該演算法允許多臺機器進行獨立並行運算,大大提高了輪廓線計算效率,同時也減少了輸入要素集(全域性計算時)的大小。對於n個點大小的均勻分佈的資料集,大約在輪廓線上的點的數量是O(logn)[4]。在實踐中,一個64MB大小的分割槽大約有7000000個點,輪廓線中真實的和統一生成資料集僅僅包含幾十個點。考慮到這些資料量比較小,也適合將所有收集的點再一臺機器上進行單獨的計算得出最終的結果。

4.2 SpatialHadoop中的Skyline

 SpatialHadoop中Skyline演算法與前面描述的Hadoop演算法非常相似,但也有兩個主要的變化。首先是在劃分階段,後者採用了SpatialHadoop劃分器當資料載入到叢集時。這樣確保了會根據一個R-tree索引進行劃分,而並不是隨機劃分的,這就意味著每臺機器上生成的輪廓線是沒有重複的。其次,在區域性輪廓步驟之前採用了額外的過濾步驟。過濾步驟在主節點上執行,需要輸入所有分割槽的R-tree索引單元的最小外包矩形(MBRS),並清除這些單元,但並不會影響最終輪廓線的結果。

  新過濾步驟的主要思想是如果在Ci中至少有一個點主導Cj中所有的點,那麼Cj可以刪除,單元Ci主導另外一個單元Cj。如圖4所示,由於C5左下角主導了C1中右上角,則C5主導了C1。輪廓線支配關係的傳遞性意味著在C5中的所有點主導C1中的所有點。同理,C6主導C4,C6的左上角主導了C4的右上角。這就是說C6上邊緣的點主導了C4左上角的點,因此主導了C4中所有的點。因為一個單元的邊界是最小的(因為R-tree分割槽),所有每一個邊界至少有一個P中的點。類似於C2主導了C3。因此在過濾步驟中刪除方法是通過一個巢狀迴圈一起測試每一對的細胞Ci和Cj。通過對比Cj的右上角和Ci的左下角、右下角以及左上角。如果任何一個角主導了Cj的右上角,就在下一步對比中刪除Cj,不發給任何一個節點。因此,對區域性skyline不進行計算,也不認為他在全域性輪廓線這個步驟中。


  值得需要注意的是,在Hadoop中應用過濾步驟不會有多大的影響,因為在Hadoop中使用的分割槽方案針對不同的單元不會產生如此分割的MBRs。基於SpatialHadoop輪廓線演算法比相應的Hadoop演算法具有更好的效能,因為過濾步驟減少了許多不需要處理的單元。感興趣的讀者可以參考附件A.2過濾步驟的原始碼。

5、凸包(CONVEX HULL)

   圖1(e)中所示的凸包採用Andrew’s Monotone Chain演算法對兩個鏈進行合併計算。說先,它將所有點按照x座標進行排序,並標識最左邊和最右邊的點。然後,凸包的上鍊通過檢查每三個連續點p,q,r反過來,從左到右。如果三個點是逆時針反向,然後,當中間點q不是上鍊的一部分,它是被跳過的,然後演算法將考慮P,rs三個點,r是成功的一個點。否則,演算法繼續檢查下三個連續的點q,r,s。一旦到達最右邊的點,演算法通過同樣的方式繼續計算更低的鏈,來檢查P中所有點,從右到左,並做相同的檢查。採用PostGIS[32],凸包,可以通過單獨的SQL語句ST_ConvexHull功能來實現。由於這個函式需要一個記錄作為引數,所以,這些點必須先通過ST_Makeline功能將其組合成一行字串。

SELECTST_ConvexHull(ST_Makeline(points.coord)) FROM points;

本節中,介紹了兩種凸包演算法,一種是基於Hadoop,一種是基於SpatialHadoop。圖1(c)中的資料集作為案例的實驗輸入資料。

5.1 Hadoop中的凸包

  Hadoop中的凸包演算法與其中的輪廓線演算法非常相似,首先需要進行分割槽,將輸入的資料劃分為更小的資料塊,每一塊都適合進行記憶體計算。然後,每一個子集的區域性凸包採用傳統的方法進行記憶體演算法計算[3],只保留形成凸包的點。這些凸包上的所有點將在一臺單機上進行全域性凸包計算,通過傳統的記憶體凸包演算法生成最終結果。與輪廓線很相似,凸包上點的個數估計為所有的資料的O(logn)[10],使得在計算區域性凸包時,刪除大多數點演算法非常高效,並且允許全域性凸包在一個節點上進行計算。 

5.2 SpatialHadoop中的凸包

   Hadoop中凸包演算法沒有必要處理更多檔案分割槽。直觀地說,檔案的中心部分不影響結果。SpatialHadoop中,通過提前刪除一些分割槽從而提高了凸包演算法而且也不影響結果。核心的思想是凸包上的任何點都必須是資料集(大大、小大、大小和小小)的四個輪廓線中的至少一個的一部分[33]。一個大/小-大/小輪廓線考慮最大/最小點在x-y維是首選。這個屬性允許重用的4.2節中輪廓線過濾步驟。如圖5所示,應用輪廓演算法四次去選擇分割槽,四個輪廓線所需要的,並將它們素有這些分割槽作為一個去處理。顯然,一個分割槽,不影響四個輪廓線的任何一個,也不會影響最終的結果。一旦要處理的分割槽被選擇後,演算法將通過計算每一個分割槽的凸包,類似於5.1小節的Hadoop演算法,然後在每臺機器上計算區域性凸包,再計算全域性凸包。SpatialHadoop演算法的獲取來源於空間意識分割槽方案,這樣允許在過濾步驟中進行資料修剪,因此在區域性和全域性進行凸包計算時可以節約成本。感興趣的讀者可以檢視附件A.3中。

 

6、最遠組對

  最遠組對的很好屬性是這兩個點組成的組對必須落在所有點的凸包上[34]。這個屬性可以通過首次計算凸包加速最遠組對操作,然後通過旋轉卡尺演算法掃描凸包來查詢最遠組對[33]。在本節中,將介紹Hadoop和SpatialHadoop中最遠組對演算法。

6.1 Hadoop中最遠組對演算法

  本節首先主要討論基於Hadoop的旋轉持卡方法[33]計算凸包演算法。然後通過一臺單獨的機器對凸包上所有點進行掃描,這在凸包上所有點的個數上可能是個瓶頸。在這種情況下,最好是開發一個基於並行處理的最遠組對演算法來實現Hadoop演算法,這種方法是計算每一個可能的點對中兩點之間的距離,並選擇其最大值。對於大檔案蠻力強迫方法代價較高,然而,如果在旋轉卡方法下不適合一臺機器從凸包的點中去計算最遠組對,這個時候可以使用該方法。總的來說,蠻力強迫和旋轉卡尺的方法在Hadoop中實現具有各自的缺點。

6.2 SpatialHadoop中最遠組對演算法

   SpatialHadoop中的演算法工作模式與輪廓線和凸包演算法類似,也分為四個步驟,即分割槽、過濾、區域性最遠組對和全域性最遠組對。在分割槽階段,主要採用SptialHadoop分割槽方案。在過濾步驟中,採用了專門的規則過濾。主要的思想如圖6所示。對於單元中的每一對組對,Ci和Cj,計算他們之間最小(最大)距離最為pi∈ci和pj∈cj(圖6(a))中任意兩點之間可能最小(最大)的距離。然後,鑑於兩個單元組對C1 =<c1, c2>和 C2 = <c3, c4>,如果C1中的最小距離不小於C2中的最大距離,那麼我們就說C1主導C2。在這種情況下,C2的組對將被刪除,因為他的資料集中不包含最遠的組對。如圖6(b)所示,C1中最遠的組對必須有一個距離大於C2中最遠的組對。在這種情況下,<C3,C4>單元中的組對將不影響最終結果,因此在下步處理過程中將不予考慮。


  一旦所有主導的單元組對都處理完畢後,演算法將通過尋找區域性凸包為每一個備選的單元組對計算區域性最遠組對,然後應用旋轉卡尺演算法計算結果[33]。重要的是要注意,當每一個組對的大小是有界單元大小的兩倍時,通過記憶體演算法計算區域性凸包是可行的。最終,演算法通過收集所有區域性最遠組對並選擇出最遠距離的組對,計算出全域性最遠組對。對於感興趣的讀者,最遠組對演算法如附件A.4所示。

7、最近組對

  任何資料集中最近組對(圖1(e))都可以通過分而治之的演算法[25]。這種思想是將所有點按照x座標進行排序,然後基於中位數,將點分為兩個子集,P1和P2,大小大致相當,在每個子集中通過計算最近組對。基於找出的兩個最近組對,演算法將計算P1中的p1所有點的最近組對和P2中的最近組對,他們之間的距離比兩個已經存在的更小。最終,演算法返回三個組對中最優組對。本節介紹基於Hadoop和SpatialHadoop的最近組對演算法。

7.1 Hadoop中最近組對演算法

  在Hadoop中採用以上描述的分而治之的思想是非常珍貴的。首先,它需要整個資料集進行與分類,就其本身而言,它需要兩輪MapReduce[29]。此外,合併的要求對經過排序的座標點進行隨機訪問,這在Hadoop檔案系統中是一個眾所周知的瓶頸。一方面,採用Hadoop預設的載入去劃分資料,並在每一個分割槽中計算區域性最近組對(類似於最遠組對演算法)可能導致交叉結果。這是因為資料劃分是隨機的,這就以為這在在不同分割槽的兩個點可能是最近的組對。最後,在5.1章節提到的最遠組問題,蠻力的方法可以解決,但對於大檔案還需要更多的計算。

7.2 SpatialHadoop中最近組對演算法

   在SpatialHadoop中最近組對演算法採用了傳統最近組對分而治之演算法[25]。演算法分為三個步驟,劃分、區域性最近組對和全域性最近組對。在劃分階段,輸入資料集是通過SpatialHadoop載入,如圖7所示將資料劃分為多個單元。每一個分割槽的大小隻有64MB,演算法通過傳統分而治之的思想對每個單元中區域性最近組對計算,然後返回兩點形成一個組對。另外,演算法也必須返回所有候選點,當加上從鄰近的單元點,通過這些候選點可能產生更近的一對。從圖7可以看出,假設C1中最近的組對距離為&1,在C1周圍做內部緩衝區,半徑為&1,然後返回緩衝區內所有點作為候選點,其他的點都可以刪除。值得注意的是,形成最近組對的兩個點然會的比較早,而且不受刪除步驟的影響。例如,每一個單元Ci在單元內部可能具有基於最近組對的不同緩衝區大小&i。對於計算所有緩衝區來說,儘管所有&中最小值可能是最好的值,但它不能夠使用,因為MapReduce框架強制所有的Map任務是獨立工作,這就使得框架在排程任務的時候更靈活。最終,在全域性最近組對計算步驟中,從所有單元返回的所有點將在一臺機器上進行計算,通過傳統分而治之演算法計算最近組對ˆp,ˆq。

  為了使得演算法正確,單元必須不能夠重複,採用SpatialHadoop劃分方法得到的單元能夠確保。這樣確保了點p被移除,沒有其他任何點更近比同一單元的距離。否則,如果單元重疊,重疊區域點p可能比其他點離點q更近,因此就會沒有點被刪掉。對於熟悉MapReduce正規化的讀者,可以檢視附件A.5原始碼。

8、實驗設計

   本節將通過實驗來研究CG_Hadoop的效率和效能。Hadoop和SpatialHadoop均是採用Apache Hadoop1.2.0和java1.6。所有的實驗在擁有25節點的學校內部叢集上執行。機器的硬碟大小從50GB到200GB不等,記憶體是2GB到8GB不等,處理速度範圍是2.2GHz到3GHz。單臺機器實驗室用2TB的硬碟,16GB的隨機存取儲存器和8核的3.4GHz處理器。


   實驗資料分為三類:(1)OSM1:從OpenStreetMap上提取的資料集[30]包含164M的多邊形(如湖泊和公園),總大小為80GB。(2)OSM2:從OpenStreetMap上提取的資料集包含全球17億個點資料(如路口和興趣點),總共大小為52GB。(3)SYNTH:在1M*1M的單元內採用不同分佈如均勻、高斯、正相關、負相關和迴圈等(見圖8)隨機生成的合成資料集。均勻和高斯是模擬許多真實現實系統應用最廣泛的分佈。正相關和負相關是用來計算輪廓線最優的案例。迴圈資料專門用於最遠組對操作,產生的凸包是非常大,不容易進行計算。最大的資料集大小有128GB,包含3.8億個點。

  本文采用所有執行時間作為主要的效能指標。有時,如果操作執行出現記憶體溢位,或資料太大導致不同演算法之間的差異不容易區別,單機實驗的結果可以不算。對真實資料和合成資料操作的實驗結果分別有8.1和8.2節給出。

8.1 真實資料

本節給出了執行OSM真實資料集處理操作的效能結果。多邊形合併演算法的結果通過多邊形來執行,而其他四個操作主要是針對點資料集。

8.1.1 多邊形合併

 圖10(a)給出了不同輸入大小的多邊形合併操作處理時間。從OSM1資料集中提取出來的不同大小的資料子集為250MB,1GB,4GB,10GB。如圖10(a)所示,單機多邊形合併演算法沒有規模,而且對於大的資料集迅速出現了記憶體溢位異常導致失敗。儘管4GB的資料集適合記憶體計算,但是該演算法採用需要更多的記憶體的內部資料結構,容易導致程式崩潰。CG_Hadoop演算法在叢集儲存計算和記憶體開銷方面擁有更好懂得負載分佈。另外,CG_Hadoop基於SpatialHadoop執行時表現更好,因為空間劃分可以加速區域性和全域性合併步驟。如3.2章節描述,空間劃分有利於減小中間資料的大小(如區域性合併輸出結果)這也會影響演算法的整個效能。


8.1.2 其他操作

  圖10(b)展示了對OSM2資料集進行不同操作的結果。結果表明CG_Hadoop擁有優於傳統技術幾個數量級。基於SpatialHadoop的CG_Hadoop的執行在圖中採用實體柱狀圖示識,但是很難看出,因為它與單機演算法相比處理時間非常少。對於輪廓線和凸包操作,當分別在Hadoop和SpatialHadoop執行CG_Hadoop達到了平均8倍和80倍的加速度。最遠組對首先計算出凸包,然後採用迴圈旋轉卡尺方法,該方法更適合凸包大小比較小的情況。這就導致了最遠組對執行時間和凸包執行時間非常相似,因為迴圈旋轉卡尺演算法針對小的凸包需要非常短的時間。之後,本文給出了最遠組對實驗,對於該方法來說,凸包太大了。最後,針對最近組對,僅給出了基於SpatialHadoop的CG_Hadoop的結果,因為單機演算法出現了記憶體溢位異常。


8.2 合成資料

  本節分別給出了生成資料的每一個操作更多的詳細結果。沒有針對合成資料進行多邊形合併,因為他需要更多先進的生成器,這個超出了本文的範圍。本文展示了四個操作,輪廓線、凸包、最遠組對和最近組對。資料集大小從4GB到128GB,生成的資料分佈如圖8所示。

  圖9是單機演算法和CG_Hadoop進行輪廓線操作的效能圖。單機演算法迴圈讀取輸入點,當實體記憶體緩衝區滿時,使用的緩衝區的大小將減少。這使得與演算法可以處理任意大小的資料。儘管單機能夠完成實驗,但是省略了一些結果來調整它的規模。當CG_Hadoop以Hadoop標準來部署,由於採用了叢集多臺機器平行計算,獲得的幾個數量級的效能。區域性輪廓線步驟在刪除大多數點僅僅留下全域性所需的點時非常有效。CG_Hadoop能夠達到兩個數量級的效能,當部署在SpatialHadoop上時。如此好的效能主要是由於過濾步驟能夠刪除分割槽而不硬性記過,減少了處理區塊的總個數。

  凸包演算法的處理時間如圖11所示。凸包演算法通過迴圈讀取輸入點,如果記憶體緩衝滿,通過凸包演算法的一次迭代和僅保留的結果記憶體使用有限。CG_Hadoop中凸包演算法描述如圖5.1所示,由於凸包通過叢集中分散式計算所以必單機演算法要快很多。CG_Hadoop在SpatialHadoop中執行更有效,因為過濾步驟允許使其最小化修剪的分割槽處理不會影響結果。儘管不是這裡顯示的清晰圖,部署在SpatialHadoop上的CG_Hadoop達到260倍加速比傳統的系統。

8.2.3最遠組對

   在CG_Hadoop中通過兩種技術計算最遠組對。第一個是通過迴圈卡尺演算法計算凸包[33],這是隻適用當凸包的大小是有限的。本文采用這項技術進行單機實驗。第二個方法是6.2節中描述的修改蠻力方法。圖12(1)不同的輸入大小進行比較兩種方法的效能。本文通過生成如圖8(e)中的迴圈資料集去獲取最大的凸包。如圖所示,第一個技術更有效,因為他需要圍繞凸包單獨掃描。然而,當凸包非常大資料大小超過主存容量時,將會失敗。另外一方面,修改後的蠻力的方法在CG_Hadoop中是低效的,因為它需要大量計算點之間的距離選擇最遠距離的組對。然而,它有一個可伸縮性優勢因為它需要相比非常小的記憶體佔用單機演算法。只有當旋轉卡尺使用方法不適用,建議修改後的蠻力。


8.2.4 最近組對

  如圖12(b)是不同輸入資料大小的最近組對實驗結果。傳統的單機演算法不能擴充套件到大檔案,因為它已經載入整個資料集記憶體。如實驗所示,當資料量達到16GB時,傳統演算法將失敗。CG_Hadoop由於兩個原因達到了最好的效能。第一個,最近組對計算時通過叢集並行演算法加快了整個演算法。第二,每一臺機器刪除了計算最近組對許多不再需要考慮的點。如圖所示,CG_Hadoop具有可伸縮性,因為每一臺機器僅僅處理每一個分割槽,在有限的時間內,需要記憶體使用的大小,不會有記憶體問題。


9、 相關工作

   在計算幾何領域使用MapReduce從理論的角度討論了[15]表明模擬MapReduce中Bulk-Synchronous平行(BSP),並應用他解決了一些計算幾何問題,如凸包等。然而,沒有提供實際的實施,沒有給出如何實現其他不依賴BSP模型的演算法。

據我們所知,我們在CG_Hadoop工作是第一個針對不同計算幾何問題提供詳細的MapReduce實現。與此同時,還充分利用了Hadoop的優勢去支援空間資料。在MapReduce中目前支援空間資料的方法可以分為兩類:(1)解決特定的空間操作和(2)提供一個空間資料框架。

特定的空間操作。現有的這類工作主要集中在Hadoop中的MapReduce上實現特定的空間操作。這些工作例項主要集中在R-tree建立[8]、空間查詢點[38]、空間查詢軌跡資料[24]、KNN[2,38]、ANN查詢[36]、RNN查詢[2]、空間連結[38]、精確KNN連結[23]、和模糊KNN連結[37]。

統一的空間操作框架。針對不同的空間操作存在四個相近的系統:(1)Hadoop-GIS[1]是一個空間資料倉儲系統,主要集中處理醫療資料。(2)Parallel-Secondo[22]是一個並行空間資料庫管理系統,採用Hadoop作為一個分散式任務排程者,當所有的儲存和空間查詢處理通過執行在叢集節點上的空間DBMS例項。(3)MD-HBase[27]擴充套件了HBase去支援多維索引,允許非常高效的使用範圍和欄位式查詢檢索點。(4)通過格網檔案和R-Tree索引擴充套件Hadoop,提供新的MapReduce元件允許在空間MapReduce程式中使用這些索引。

   本文的工作,CG_Hadoop,基於以上兩個部分。首先,並沒有完全集中在一個特定的空間操作上。而是涵蓋了5個不同和基礎的計算幾何空間操作。第二,沒有提供一個新的系統。而是提供了一個基於SpatialHadoop的多種計算幾何演算法的高效實施,這樣可以利用提供的空間索引得到更高的效能。總之,CG_Hadoop形成了綜合的MapReduce類庫的核心,來進行計算幾何操作。它的開源特性也使得他能夠成為一個研究載體,供研究者去建立更多的計算幾何演算法,充分發揮MapReduce正規化的優勢。

10、 結論

  本文介紹了CG_Hadoop;一套可伸縮的和高效的MapReduce演算法,對各種基本計算幾何操作,即,多邊形合併、凸包、最遠墜和最近組對。對於每一種操作,CG_Hadoop具有兩個版本:基於Apache Hadoop系統和基於SpatialHadoop系統。CG_HAdoop中的演算法採用了分而治之的方法,利用Hadoop和分散式並行環境SpatialHadoop,從而比相應的傳統演算法達到更好的效能。同時,SpatialHadoop演算法明顯優於Hadoop演算法,因為他們利用SpatialHadoop之內空間索引和元件。總的來說,CG_Hadoop形式一個全面的MapReduce計算幾何類庫操作。在一群25臺機器叢集中的,資料達到了128GB,廣泛的實驗結果表明使用Hadoop和SpatialHadoop系統的CG_Hadoop比傳統演算法分別達到了29倍和260倍。

相關文章