摘要: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。java
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節進行了討論。最後一節是本文的結論。機器學習
本章節給出了關於Hadoop和SpatialHadoop兩個系統的背景信息。CG_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]等。
SpatialHadoop是基於Hadoop的一個全面擴展,可以實現空間操做的高效處理。重要的是,SpatialHadoop在Hadoop 存儲層提供了兩層空間索引,實現了基於格網文件[26]、R-tree[16]索引。豐富了MapReduce層,嵌入了兩個新的組件,在該層容許使用空 間索引。SpatialHadoop經過創建索引來提升一些空間操做的算法效率。
SpatialHadoop的空間索引包括一個全局索引和多個局部索引。全局索引經過集羣節點數據劃分數據,而局部索引在每個節點內部組織數據。 在MapReduce層新嵌入的組件經過全局和局部索引來修剪文件的分區和記錄,但不會影響操做結果。修剪的標準取決於用於定義的過濾功能,這個能夠經過 MapReduce程序來提供。
正如上文所述,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)所示。
傳統算法爲多邊形合併操做[33]計算兩個多邊形的合併經過計算全部邊緣交叉,刪除全部內部部分,僅留下週邊的部分。對於兩個以上的多邊形合併,首 先合併兩個多邊形,而後與下一個多邊形合併直到全部的多邊形都合併成一個多邊形。PostGIS[32]中,經過如下SQL查詢語句來執行這個操做,每一 列geom存儲了每個ZIP代碼的多邊形信息。
SELECT ST_Union(zip_codes.geom)FROM zip_codes;
本節介紹了基於Hadoop和SpatialHadoop的兩個多邊形合併算法。以圖1(a)中的數據集做爲輸入。爲了便於說明,同時保持表明性,實例中的多邊形不存在重疊現象。
Hadoop中多邊形合併算法核心思想是容許每一臺機器累加多邊形的子集,而後讓一臺機器將全部機器的結果都收集起來並計算出最終答案。算法步驟如 下:分區、局部分區和全局分區。第一步分區是將輸入的多邊形分爲更小的子集存儲在每一臺機器上。該步驟由Hadoop加載文件命令執行,能夠將文件劃分爲 64MB大小的組塊存儲在每個從節點上。第二步是創建局部索引。每一臺機器經過傳統的內存中多邊形合併算法計算該機器上多邊形合併。由於每個數據塊最 大爲64MB,因此內存算法實現跟輸入文件的大小無關。這些步驟做爲一個聯合功能再Hadoop中實現,運行在每一臺機器中。當執行完局部合併以後,每一 臺機器會生成一組多邊形做爲該機器上分配的全部多邊形的合併結果。全局合併在Hadoop中是以reduce功能來實現的,這個過程是在一臺機器上計算最 終的而結果。Reduce函數取出全部局部計算的合併結果,而後合併成一個,對他們再經過傳統的內存計算算法進行合併。每一臺機器最終將生成只有幾個多邊 形,這樣可使用內存算法進行多邊形合併。
經過充分利用並行機器的優點,而不是在一臺機器上完成全部的工做,本文提出的算法與傳統的算法相比具備明顯的優點。儘管將數據分配到每臺機器上,再 從每一臺機器上搜索結果都會有所開銷,這樣的開銷能夠經過並行機器的成本抵消掉,並且也能夠用來處理更大尺度的空間數據集。對於更感興趣,並且也比較熟悉 MapReduce編程範式的讀者,附件A.1.給出了基於Hadoop的多邊形合併算法的源代碼。
圖2給出了圖1(a)的輸入數據集經過四個集羣計算節點進行分區和局部合併的過程,四個節點每個多邊形分配到一個節點。決定哪一個節點屬於哪一個分區徹底取決於Hadoop負載文件組件,基本上是隨機分配多邊形到每個節點上。
經過圖中的結果,能夠發現分配到一個節點的多邊形合併後徹底保持獨立。在這種狀況下,素有的多邊形都做爲輸出結果。而後,全部節點的輸出結果將經過一個單獨的機器進行計算得出最終的答案,如圖1(b)所示。
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.)。
傳統的內存中二維輪廓算法是採用分而治之的思想,首先將全部點按照X座標進行排序,並經過一條垂直線將全部點分爲兩個大小相等的子集。每一半的輪廓 經過遞歸計算,最終的輪廓線經過二者合併計算獲得。合併兩條輪廓線,左邊輪廓線的點按照非遞減X順序進行掃描,也就是按照非遞增Y順序進行掃描,每個都 和右邊輪廓線最左邊的點進行比較。一旦左邊軌跡線的點佔優點,那麼就刪除掉左邊輪廓線上的全部後續點,兩條輪廓線上剩餘的點連接在一塊兒。在數據庫管理系統 中是不支持輪廓線操做符的。然而,在數據庫中這些主要基於磁盤的算法具備很是大的意義(例如[7, 31])經過非標準SQL查詢。
SELECT * FROM points SKYLINEOF d1 MAX, d2 MAX;
本節介紹了兩種輪廓線算法,一種基於Hadoop,一種基於SpatialHadoop。以圖1(c)中的數據爲輸入數據集。
本文Hadoop中的skyline算法是傳統分而治之skyline算法的一種演變[33],是將輸入的數據劃分爲多個(多於兩個)部分,每一部 分能夠經過一臺機器來處理。經過這樣的方式,輸入的數據經過全部機器須要一次被劃分,確保結果可以在一次MapReduce迭代過程當中獲得。相似於 Hadoop多邊形合併算法,Hadoop輪廓線算法分爲三步來執行:劃分、局部輪廓線和全局輪廓線。劃分步驟將輸入的數據集劃分爲64MB大小的更小組 塊,並將它們分配到每一臺機器上。局部輪廓線步驟是指每一臺機器經過傳統的算法計算本機器上的數據組塊輪廓線,僅輸出非主導地位的點。最終經過全局輪廓線 步驟,一臺機器收集全部局部輪廓線的點,而後計算這些點的最終輪廓線。值得注意的是,不可以經過內存算法來進行合併這些局部輪廓線,由於局部輪廓線不是通 過一條垂直線進行分開的,實際上他們之間有可能重疊。經過Hadoop劃分數據塊是隨機劃分的,並無考慮數據之間的空間位置。全局輪廓線步驟計算最終的 結果,經過傳統的輪廓線算法將局部輪廓線中的全部點合併成一個要素集。熟悉MapReduce編程的用戶能夠參考附件A.2的源代碼。
該算法容許多臺機器進行獨立並行運算,大大提升了輪廓線計算效率,同時也減小了輸入要素集(全局計算時)的大小。對於n個點大小的均勻分佈的數據 集,大約在輪廓線上的點的數量是O(logn)[4]。在實踐中,一個64MB大小的分區大約有7000000個點,輪廓線中真實的和統一輩子成數據集僅僅 包含幾十個點。考慮到這些數據量比較小,也適合將全部收集的點再一臺機器上進行單獨的計算得出最終的結果。
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過濾步驟的源代碼。
圖1(e)中所示的凸包採用Andrew’s Monotone Chain算法對兩個鏈進行合併計算。說先,它將全部點按照x座標進行排序,並標識最左邊和最右邊的點。而後,凸包的上鍊經過檢查每三個連續點 p,q,r,反過來,從左到右。若是三個點是逆時針反向,而後,當中間點q不是上鍊的一部分,它是被跳過的,而後算法將考慮P,r,s三個點,r是成功的 一個點。不然,算法繼續檢查下三個連續的點q,r,s。一旦到達最右邊的點,算法經過一樣的方式繼續計算更低的鏈,來檢查P中全部點,從右到左,並作相同 的檢查。採用PostGIS[32],凸包,能夠經過單獨的SQL語句ST_ConvexHull功能來實現。因爲這個函數須要一個記錄做爲參數,因此, 這些點必須先經過ST_Makeline功能將其組合成一行字符串。
SELECTST_ConvexHull(ST_Makeline(points.coord)) FROM points;
本節中,介紹了兩種凸包算法,一種是基於Hadoop,一種是基於SpatialHadoop。圖1(c)中的數據集做爲案例的實驗輸入數據。
Hadoop中的凸包算法與其中的輪廓線算法很是類似,首先須要進行分區,將輸入的數據劃分爲更小的數據塊,每一塊都適合進行內存計算。而後,每一 個子集的局部凸包採用傳統的方法進行內存算法計算[3],只保留造成凸包的點。這些凸包上的全部點將在一臺單機上進行全局凸包計算,經過傳統的內存凸包算 法生成最終結果。與輪廓線很類似,凸包上點的個數估計爲全部的數據的O(logn)[10],使得在計算局部凸包時,刪除大多數點算法很是高效,而且容許 全局凸包在一個節點上進行計算。
Hadoop中凸包算法沒有必要處理更多文件分區。直觀地說,文件的中心部分不影響結果。SpatialHadoop中,經過提早刪除一些分區從而 提升了凸包算法並且也不影響結果。核心的思想是凸包上的任何點都必須是數據集(大大、小大、大小和小小)的四個輪廓線中的至少一個的一部分[33]。一個 大/小-大/小輪廓線考慮最大/最小點在x-y維是首選。這個屬性容許重用的4.2節中輪廓線過濾步驟。如圖5所示,應用輪廓算法四次去選擇分區,四個輪 廓線所須要的,並將它們素有這些分區做爲一個去處理。顯然,一個分區,不影響四個輪廓線的任何一個,也不會影響最終的結果。一旦要處理的分區被選擇後,算 法將經過計算每個分區的凸包,相似於5.1小節的Hadoop算法,而後在每臺機器上計算局部凸包,再計算全局凸包。SpatialHadoop算法的 獲取來源於空間意識分區方案,這樣容許在過濾步驟中進行數據修剪,所以在局部和全局進行凸包計算時能夠節約成本。感興趣的讀者能夠查看附件A.3中。
最遠組對的很好屬性是這兩個點組成的組對必須落在全部點的凸包上[34]。這個屬性能夠經過首次計算凸包加速最遠組對操做,而後經過旋轉卡尺算法掃描凸包來查找最遠組對[33]。在本節中,將介紹Hadoop和SpatialHadoop中最遠組對算法。
本節首先主要討論基於Hadoop的旋轉持卡方法[33]計算凸包算法。而後經過一臺單獨的機器對凸包上全部點進行掃描,這在凸包上全部點的個數上 多是個瓶頸。在這種狀況下,最好是開發一個基於並行處理的最遠組對算法來實現Hadoop算法,這種方法是計算每個可能的點對中兩點之間的距離,並選 擇其最大值。對於大文件蠻力強迫方法代價較高,然而,若是在旋轉卡方法下不適合一臺機器從凸包的點中去計算最遠組對,這個時候可使用該方法。總的來講, 蠻力強迫和旋轉卡尺的方法在Hadoop中實現具備各自的缺點。
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所示。
任何數據集中最近組對(圖1(e))均可以經過分而治之的算法[25]。這種思想是將全部點按照x座標進行排序,而後基於中位數,將點分爲兩個子 集,P1和P2,大小大體至關,在每一個子集中經過計算最近組對。基於找出的兩個最近組對,算法將計算P1中的p1全部點的最近組對和P2中的最近組對,他 們之間的距離比兩個已經存在的更小。最終,算法返回三個組對中最優組對。本節介紹基於Hadoop和SpatialHadoop的最近組對算法。
在Hadoop中採用以上描述的分而治之的思想是很是珍貴的。首先,它須要整個數據集進行與分類,就其自己而言,它須要兩輪 MapReduce[29]。此外,合併的要求對通過排序的座標點進行隨機訪問,這在Hadoop文件系統中是一個衆所周知的瓶頸。一方面,採用 Hadoop默認的加載去劃分數據,並在每個分區中計算局部最近組對(相似於最遠組對算法)可能致使交叉結果。這是由於數據劃分是隨機的,這就覺得這在 在不一樣分區的兩個點多是最近的組對。最後,在5.1章節提到的最遠組問題,蠻力的方法能夠解決,但對於大文件還須要更多的計算。
在SpatialHadoop中最近組對算法採用了傳統最近組對分而治之算法[25]。算法分爲三個步驟,劃分、局部最近組對和全局最近組對。在劃 分階段,輸入數據集是經過SpatialHadoop加載,如圖7所示將數據劃分爲多個單元。每個分區的大小隻有64MB,算法經過傳統分而治之的思想 對每一個單元中局部最近組對計算,而後返回兩點造成一個組對。另外,算法也必須返回全部候選點,當加上從鄰近的單元點,經過這些候選點可能產生更近的一對。 從圖7能夠看出,假設C1中最近的組對距離爲&1,在C1周圍作內部緩衝區,半徑爲&1,而後返回緩衝區內全部點做爲候選點,其餘的點都 能夠刪除。值得注意的是,造成最近組對的兩個點然會的比較早,並且不受刪除步驟的影響。例如,每個單元Ci在單元內部可能具備基於最近組對的不一樣緩衝區 大小&i。對於計算全部緩衝區來講,儘管全部&中最小值多是最好的值,但它不可以使用,由於MapReduce框架強制全部的Map任 務是獨立工做,這就使得框架在調度任務的時候更靈活。最終,在全局最近組對計算步驟中,從全部單元返回的全部點將在一臺機器上進行計算,經過傳統分而治之 算法計算最近組對ˆp,ˆq。
爲了使得算法正確,單元必須不可以重複,採用SpatialHadoop劃分方法獲得的單元可以確保。這樣確保了點p被移除,沒有其餘任何點更近比 同一單元的距離。不然,若是單元重疊,重疊區域點p可能比其餘點離點q更近,所以就會沒有點被刪掉。對於熟悉MapReduce範式的讀者,能夠查看附件 A.5源代碼。
本節將經過實驗來研究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節給出。
本節給出了運行OSM真實數據集處理操做的性能結果。多邊形合併算法的結果經過多邊形來運行,而其餘四個操做主要是針對點數據集。
圖10(a)給出了不一樣輸入大小的多邊形合併操做處理時間。從OSM1數據集中提取出來的不一樣大小的數據子集爲 250MB,1GB,4GB,10GB。如圖10(a)所示,單機多邊形合併算法沒有規模,並且對於大的數據集迅速出現了內存溢出異常致使失敗。儘管 4GB的數據集適合內存計算,可是該算法採用須要更多的內存的內部數據結構,容易致使程序崩潰。CG_Hadoop算法在集羣存儲計算和內存開銷方面擁有 更好懂得負載分佈。另外,CG_Hadoop基於SpatialHadoop運行時表現更好,由於空間劃分能夠加速局部和全局合併步驟。如3.2章節描 述,空間劃分有利於減少中間數據的大小(如局部合併輸出結果)這也會影響算法的整個性能。
圖10(b)展現了對OSM2數據集進行不一樣操做的結果。結果代表CG_Hadoop擁有優於傳統技術幾個數量級。基於SpatialHadoop 的CG_Hadoop的運行在圖中採用實體柱狀圖標識,可是很難看出,由於它與單機算法相比處理時間很是少。對於輪廓線和凸包操做,當分別在Hadoop 和SpatialHadoop運行CG_Hadoop達到了平均8倍和80倍的加速度。最遠組對首先計算出凸包,而後採用循環旋轉卡尺方法,該方法更適合 凸包大小比較小的狀況。這就致使了最遠組對運行時間和凸包運行時間很是類似,由於循環旋轉卡尺算法針對小的凸包須要很是短的時間。以後,本文給出了最遠組 對實驗,對於該方法來講,凸包太大了。最後,針對最近組對,僅給出了基於SpatialHadoop的CG_Hadoop的結果,由於單機算法出現了內存 溢出異常。
本節分別給出了生成數據的每個操做更多的詳細結果。沒有針對合成數據進行多邊形合併,由於他須要更多先進的生成器,這個超出了本文的範圍。本文展現了四個操做,輪廓線、凸包、最遠組對和最近組對。數據集大小從4GB到128GB,生成的數據分佈如圖8所示。
圖9是單機算法和CG_Hadoop進行輪廓線操做的性能圖。單機算法循環讀取輸入點,當物理內存緩衝區滿時,使用的緩衝區的大小將減小。這使得與 算法能夠處理任意大小的數據。儘管單機可以完成實驗,可是省略了一些結果來調整它的規模。當CG_Hadoop以Hadoop標準來部署,因爲採用了集羣 多臺機器並行計算,得到的幾個數量級的性能。局部輪廓線步驟在刪除大多數點僅僅留下全局所需的點時很是有效。CG_Hadoop可以達到兩個數量級的性 能,當部署在SpatialHadoop上時。如此好的性能主要是因爲過濾步驟可以刪除分區而不硬性記過,減小了處理區塊的總個數。
凸包算法的處理時間如圖11所示。凸包算法經過循環讀取輸入點,若是內存緩衝滿,經過凸包算法的一次迭代和僅保留的結果內存使用有限。 CG_Hadoop中凸包算法描述如圖5.1所示,因爲凸包經過集羣中分佈式計算因此必單機算法要快不少。CG_Hadoop在 SpatialHadoop中運行更有效,由於過濾步驟容許使其最小化修剪的分區處理不會影響結果。儘管不是這裏顯示的清晰圖,部署在 SpatialHadoop上的CG_Hadoop達到260倍加速比傳統的系統。
在CG_Hadoop中經過兩種技術計算最遠組對。第一個是經過循環卡尺算法計算凸包[33],這是隻適用當凸包的大小是有限的。本文采用這項技術 進行單機實驗。第二個方法是6.2節中描述的修改蠻力方法。圖12(1)不一樣的輸入大小進行比較兩種方法的性能。本文經過生成如圖8(e)中的循環數據集 去獲取最大的凸包。如圖所示,第一個技術更有效,由於他須要圍繞凸包單獨掃描。然而,當凸包很是大數據大小超過主存容量時,將會失敗。另一方面,修改後 的蠻力的方法在CG_Hadoop中是低效的,由於它須要大量計算點之間的距離選擇最遠距離的組對。然而,它有一個可伸縮性優點由於它須要相比很是小的內 存佔用單機算法。只有當旋轉卡尺使用方法不適用,建議修改後的蠻力。
如圖12(b)是不一樣輸入數據大小的最近組對實驗結果。傳統的單機算法不能擴展到大文件,由於它已經加載整個數據集內存。如實驗所示,當數據量達到 16GB時,傳統算法將失敗。CG_Hadoop因爲兩個緣由達到了最好的性能。第一個,最近組對計算時經過集羣並行算法加快了整個算法。第二,每一臺機 器刪除了計算最近組對許多再也不須要考慮的點。如圖所示,CG_Hadoop具備可伸縮性,由於每一臺機器僅僅處理每個分區,在有限的時間內,須要內存使 用的大小,不會有內存問題。
在計算幾何領域使用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範式的優點。
本文介紹了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倍。