用 MapReduce 框架,程序員寫一個封裝有 map 和 reduce 函數(shù)的獨立代碼片段來處 理 HDFS 上的數(shù)據(jù)集。為取到數(shù)據(jù)位置,代碼打包(jar 格式)分發(fā)到數(shù)據(jù)節(jié)點, Map 操作就在這些數(shù)據(jù)節(jié)點上執(zhí)行,這避免了集群的數(shù)據(jù)傳輸導致消耗網(wǎng)絡(luò)帶寬。 對于 Reduce 聚合操作,Map 的結(jié)果被傳輸?shù)蕉鄠€ Reduce 節(jié)點上做 reduce 操作(稱 之為 shuf?ing)。首先,Map 階段是并行操作的,Hadoop 提供了一個彈性機制,當 一個機器節(jié)點或者一個處理過程失敗時,計算會在其他機器節(jié)點上重啟。
MapReduce 編程框架將數(shù)據(jù)集抽象為流式 key-value 鍵值對,然后處理這些鍵 值對并寫回到 HDFS。這是一個有局限的范式,但它已被用來解決許多數(shù)據(jù)并行問題, 用鏈接在一起的 MapReduce 進行“讀-處理-寫”操作過程。對于一些簡單的任務(wù),上圖顯示的是比較適合的場景。但是對于一些如機器學習算法中的迭代計算算 法,用這種 MapReduce 范式就很痛苦,這也是選擇使用 Spark 的原因。
Spark :內(nèi)存中的 MapReduce 處理
我們來看另一個可選的分布式處理系統(tǒng),構(gòu)建在 Hadoop 基礎(chǔ)之上的 Spark。在這一小節(jié)你會了解到,在 Spark 處理圖數(shù)據(jù)時扮演重要角色的彈性分 布式數(shù)據(jù)集(RDD)導致 Hadoop 衰落的兩類問題是 :
交互式查詢 迭代算法
Hadoop 很適合在一個大的數(shù)據(jù)集上做單次查詢,而在許多實際場景中,一旦有 了一個想要的答案,我們就想再問數(shù)據(jù)一個問題,這就是交互式查詢。使用 Hadoop 的話,就意味著要等待重新從磁盤中加載數(shù)據(jù),再次處理數(shù)據(jù)。我們不得不執(zhí)行一 組相同的計算作為隨后分析的前提,這不符合常理。
迭代算法已經(jīng)被廣泛應(yīng)用于機器學習任務(wù),如隨機梯度下降算法,以及之后 會看到的 PageRank 這類圖計算算法。迭代算法是在一個數(shù)據(jù)集上一遍又一遍地做 一組計算,直到滿足一個標準(循環(huán)結(jié)束條件)才結(jié)束迭代。 在 Hadoop 中實現(xiàn)這種算法,一般需要一系列加載數(shù)據(jù)的 MapReduce 任務(wù),這些 MapReduce 任務(wù)要在 每一個迭代過程中重復運行。對于非常大的數(shù)據(jù)集,每個迭代過程要花費 100 秒或1000 秒,整個迭代過程非常耗時。
下面你會看到 Spark 如何解決這些問題。如 Hadoop 一樣,Spark 也是運行在 一個常見的硬件配置的機器集群上。Spark 中的一個核心抽象是彈性分布式數(shù)據(jù)集(RDD)。RDD 是由 Spark 應(yīng)用創(chuàng)建的(在Spark Driver上),由集群管理,如下圖。
Spark 提供一個彈性分布式數(shù)據(jù)集,可以認為它是一個分布式的常駐內(nèi)存的數(shù)組。
組成 RDD 分布式數(shù)據(jù)集的數(shù)據(jù)分區(qū)會被加載到集群的機器上。
基于內(nèi)存的數(shù)據(jù)處理
Spark 執(zhí)行的大部分操作都是在隨機訪問內(nèi)存中(RAM)進行。Spark 是基于內(nèi) 存的,而 Hadoop Map/Reduce 是順序處理數(shù)據(jù),所以 Spark 比 Hadoop 更適合處理 隨機訪問的圖數(shù)據(jù)。
Spark 的關(guān)鍵好處在于交互式查詢和迭代處理過程中在內(nèi)存中緩存 RDD。緩存 起來的 RDD 可以避免每次重新處理父 RDD 鏈,而只需要直接返回父 RDD 計算后 的緩存結(jié)果。
自然的,這意味著要用到 Spark 的基于內(nèi)存的計算處理特性,要求集群中的機 器內(nèi)存要足夠大。要是可用內(nèi)存不夠,那么 Spark 就會優(yōu)雅地溢出數(shù)據(jù)到磁盤,以 保證 Spark 能繼續(xù)運行。
當然 Spark 集群也需要一個持久化存儲數(shù)據(jù)的地方,而且還要是分布式存儲系 統(tǒng)才行,可選的有 HDFS、Cassandra 和亞馬遜的 S3。
本文選自《SparkGraphX實戰(zhàn)》。