和 Hadoop 一樣,Spark 提供了一個 Map/Reduce API(分布式計(jì)算)和分布式存儲。二者主要的不同點(diǎn)是,Spark 在集群的內(nèi)存中保存數(shù)據(jù),而 Hadoop 在集群的磁盤中存儲數(shù)據(jù)。
大數(shù)據(jù)對一些數(shù)據(jù)科學(xué)團(tuán)隊(duì)來說是 主要的挑戰(zhàn),因?yàn)樵谝蟮目蓴U(kuò)展性方面單機(jī)沒有能力和容量來運(yùn)行大規(guī)模數(shù)據(jù)處 理。此外,即使專為大數(shù)據(jù)設(shè)計(jì)的系統(tǒng),如 Hadoop,由于一些數(shù)據(jù)的屬性問題也很難有效地處理圖數(shù)據(jù),我們將在本章的其他部分看到這方面的內(nèi)容。
Apache Spark 與 Hadoop 類似,數(shù)據(jù)分布式存儲在服務(wù)器的集群或者是“節(jié)點(diǎn)”上。 不同的是,Spark 將數(shù)據(jù)保存在內(nèi)存(RAM)中,Hadoop 把數(shù)據(jù)保存在磁盤(機(jī)械 硬盤或者 SSD 固態(tài)硬盤)中。
定義 :在圖和集群計(jì)算方面,“節(jié)點(diǎn)”這個詞有兩種截然不同的意思。 圖數(shù)據(jù)由頂點(diǎn)和邊組成,在這里“節(jié)點(diǎn)”與頂點(diǎn)的意思相近。在集群計(jì)算 方面,組成集群的物理機(jī)器也被稱為“節(jié)點(diǎn)”。為避免混淆,我們稱圖的 節(jié)點(diǎn)為頂點(diǎn),這也是 Spark 中的專有名詞。而本書中的“節(jié)點(diǎn)”這個詞我 們嚴(yán)格定義為集群中的單個物理計(jì)算節(jié)點(diǎn)。
大數(shù)據(jù)因?yàn)閿?shù)據(jù)量大單機(jī)無法處理。Hadoop 和 Spark 都是把數(shù)據(jù)分布在集群節(jié)點(diǎn)上的分 布式框架中。Spark 把分布式數(shù)據(jù)集存放在內(nèi)存中,所以比 Hadoop 把數(shù)據(jù)存放在磁盤中 處理速度要快很多。
除了將要計(jì)算的數(shù)據(jù)保存的位置不同(內(nèi)存和磁盤),Spark 的 API 比 Hadoop的 Map/Reduce API 更容易使用。Spark 使用簡潔且表達(dá)力較好的 Scala 作為原生編程語言,寫 Hadoop Map/Reduce 的 Java 代碼行數(shù)與寫 Spark 的 Scala 的代碼行的數(shù) 量比一般是 10:1。
雖然本書主要使用 Scala,但是你對 Scala 不熟悉也不用擔(dān)心,我們在第 3 章提 供了快速入門,包括怪異、晦澀和簡練的 Scala 語法。進(jìn)一步熟悉 Java、C++、C#、 Python 等至少一門編程語言是必要的。
模糊的大數(shù)據(jù)定義
現(xiàn)在的“大數(shù)據(jù)”概念已經(jīng)被很大程度地夸大了。大數(shù)據(jù)的概念可以追溯到Google 在 2003 年發(fā)表的 Google 文件系統(tǒng)的論文和 2004 年發(fā)表的 Map/Reduce 論文。
大數(shù)據(jù)這個術(shù)語有多種不同的定義,并且有些定義已經(jīng)失去了大數(shù)據(jù)所應(yīng)有的意 義。但是簡單的核心且至關(guān)重要的意義是:大數(shù)據(jù)是因數(shù)據(jù)本身太大,單機(jī)無法處理。
數(shù)據(jù)量已經(jīng)呈爆炸性增長。數(shù)據(jù)來自網(wǎng)站的點(diǎn)擊、服務(wù)器日志和帶有傳感器的 硬件等,這些稱為數(shù)據(jù)源。有些數(shù)據(jù)是圖數(shù)據(jù)(graph data),意味著由邊和頂點(diǎn)組成, 如一些協(xié)作類網(wǎng)站(屬于“Web 2.0”的社交媒體的一種)。大的圖數(shù)據(jù)集實(shí)際上是 眾包的,例如知識互相連接的 Wikipedia、Facebook 的朋友數(shù)據(jù)、LinkedIn 的連接數(shù) 據(jù),或者 Twitter 的粉絲數(shù)據(jù)。
Hadoop :Spark 之前的世界
在討論 Spark 之前,我們總結(jié)一下 Hadoop 是如何解決大數(shù)據(jù)問題的,因?yàn)镾park 是建立在下面將要描述的核心 Hadoop 概念之上的。
Hadoop 提供了在集群機(jī)器中實(shí)現(xiàn)容錯、并行處理的框架。Hadoop 有兩個關(guān)鍵 能力 :
HDFS—分布式存儲 MapReduce—分布式計(jì)算
HDFS 提供了分布式、容錯存儲。NameNode 把單個大文件分割成小塊,典型 的塊大小是 64MB 或 128MB。這些小塊文件被分散在集群中的不同機(jī)器上。容錯性 是將每個文件的小塊復(fù)制到一定數(shù)量的機(jī)器節(jié)點(diǎn)上(默認(rèn)復(fù)制到 3 個不同節(jié)點(diǎn), 下圖中為了表示方便,將復(fù)制數(shù)設(shè)置為 2)。假如一個機(jī)器節(jié)點(diǎn)失效,致使這個機(jī)器上的 所有文件塊不可用,但其他機(jī)器節(jié)點(diǎn)可以提供缺失的文件塊。這是 Hadoop 架構(gòu)的 關(guān)鍵理念 :機(jī)器出故障是正常運(yùn)作的一部分。
三個分布式數(shù)據(jù)塊通過 Hadoop 分布式文件系統(tǒng)(HDFS)保持兩個副本。
MapReduce 是提供并行和分布式計(jì)算的 Hadoop 并行處理框架,如下圖 。
MapReduce 是被 Hadoop 和 Spark 都用到的一個數(shù)據(jù)處理范式。圖中表示計(jì)算服務(wù)器日 志文件中“error”出現(xiàn)的次數(shù),這是一個 MapReduce 操作。通常 Map 操作是一對一的 操作,對每一個源數(shù)據(jù)項(xiàng)生成一個相應(yīng)的數(shù)據(jù)轉(zhuǎn)換操作。Reduce 是多對一的操作,聚合 Map 階段的輸出。Hadoop 和 Spark 都用到了 MapReduce 范式。