天天看點

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

什麼是spark?可能你很多年前就使用過spark,反正當年我四六級單詞都是用的星火系列,沒錯,星火系列的洋名就是spark。

當然這裡說的spark指的是apache spark,apache spark™is a fast and general engine for large-scale data processing: 一種快速通用可擴充的資料分析引擎。如果想要搞清楚spark是什麼,那麼我們需要知道它解決了什麼問題,還有是怎麼解決這些問題的。

在這裡不得不提大資料,大資料有兩個根本性的問題,一個是資料很大,如何存儲?另外一個是資料很大,如何分析?畢竟分析大資料是為了改善産品的使用者體驗,進而擷取更多的價值。

對于第一個問題,開源社群給出的方案就是hdfs,一個非常優秀的分布式存儲系統。

對于第二個問題,在hadoop之 後,開源社群推出了許多值得關注的大資料分析平台。這些平台範圍廣闊,從簡單的基于腳本的産品到與hadoop 類似的生産環境。bashreduce在 bash環境中的多個機器上執行 mapreduce 類型的操作,可以直接引用強大的linux指令。graphlab 也是一種mapreduce 抽象實作,側重于機器學習算法的并行實作。還有twitter 的 storm(通過收購 backtype 獲得)。storm 被定義為 “實時處理的 hadoop”,它主要側重于流處理和持續計算。

spark就是解決第二個問題的佼佼者。why spark?

現在有很多值得關注的大資料分析平台,那麼為什麼要選擇spark呢?

與hadoop的mapreduce相比,spark基于記憶體的運算比mr要快100倍;而基于硬碟的運算也要快10倍!

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

(from the project homepage)

spark支援java,python和scala。而且支援互動式的python和scala的shell,這意味這你可以非常友善的在這些shell中使用spark叢集來驗證你的解決問題的方法,而不是像以前一樣,打包。。。這對于原型開發非常重要!

hadoop的worldcount的mapper和reducer加起來要20多行吧。spark僅需要:

甚至可以将它們放到一行。

spark提供了all in one的解決方案!

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

·        shark sq:應用于即席查詢(ad-hocquery)

·        spark streaming:應用于流式計算

·        mllib:應用于機器學習

·        graphx: 應用于圖處理

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

spark all in one的解決方案非常具有吸引力,畢竟任何公司都想要unified的平台去處理遇到的問題,可以減少開發和維護的人力成本和部署平台的物力成本。

當然還有,作為all in one的解決方案,spark并沒有以犧牲性能為代價。相反,在性能方面,spark還有很大的優勢。

spark可以使用yarn作為它的叢集管理器,并且可以處理hdfs的資料。這對于已經部署hadoop叢集的使用者特别重要,畢竟不需要做任何的資料遷移就可以使用spark的強大處理能力。spark可以讀取hdfs,hbase, cassandra等一切hadoop的資料。

當然了對于沒有部署并且沒有計劃部署hadoop叢集的使用者來說,spark仍然是一個非常好的解決方法,它還支援standalone, ec2 和 mesos。你隻要保證叢集的節點可以通路共享的内容,比如通過nfs你就可以非常容易的使用spark!

spark是如何做到呢?或者說spark的核心是如何實作的?

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

先說解釋一下上圖的術語:

driver program: 運作main函數并且建立sparkcontext的程式。

sparkcontext:spark程式的入口,負責排程各個運算資源,協調各個worker node上的executor。

application: 基于spark的使用者程式,包含了driver程式和叢集上的executor

cluster manager: 叢集的資料總管(例如: standalone,mesos,yarn)

worker node: 叢集中任何可以運作應用代碼的節點

executor: 是在一個worker node上為某應用啟動的一個程序,該程序負責運作任務,并且負責将資料存在記憶體或者磁盤上。每個應用都有各自獨立的executors

task: 被送到某個executor上的工作單元

了解了各個術語的含義後,我們看一下一個使用者程式是如何從送出到最終到叢集上執行的:

1.      sparkcontext連接配接到clustermanager,并且向clustermanager申請executors。

2.      sparkcontext向executors發送application code。

3.      sparkcontext向executors發送tasks,executor會執行被配置設定的tasks。

運作時的狀态如下圖:

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

(from paper resilient distributed datasets: a fault-tolerant abstractionfor in-memory cluster computing)

首先看一下為什麼mapreduce那麼慢。速度可能是mapreduce最被人們诟病的地方。傳統的mapreduce架構慢在哪裡。

基于記憶體的計算式spark速度很快的原因之一。spark的運算模型也是它出色性能的重要保障。spark的關鍵運算元件如下圖。

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

rdd是spark的基石,也是spark的靈魂。說spark不得不提rdd,那麼rdd(resilient distributed dataset,彈性分布式資料集)是什麼呢?當然了,論文resilient distributed datasets: a fault-tolerant abstraction for in-memory cluster computing是了解rdd必不可少的,它從學術,實作給出了什麼是rdd。下面是從rdd的實作源碼的注釋中說明了rdd的特性。

a list of partitions

a function for computing each split

a list of dependencies on other rdds

optionally, a partitioner for key-value rdds (e.g. to say that the rdd is hash-partitioned)

optionally, a list of preferred locations to compute each split on (e.g. block locations for an hdfs file)

接着把對應的實作接口的源碼貼一下,以友善去源碼中查找rdd的核心架構:

分區 protected def getpartitions: array[partition]

依賴 protected def getdependencies: seq[dependency[_]] = deps

函數 def compute(split: partition, context: taskcontext): iterator[t]

最佳位置(可選) protected def getpreferredlocations(split: partition): seq[string] = nil

分區政策(可選) @transient val partitioner: option[partitioner] = none

rdd支援兩種操作:轉換(transformation)從現有的資料集建立一個新的資料集;而動作(actions)在資料集上運作計算後,傳回一個值給驅動程式。 例如,map就是一種轉換,它将資料集每一個元素都傳遞給函數,并傳回一個新的分布資料集表示結果。另一方面,reduce是一種動作,通過一些函數将所有的元素疊加起來,并将最終結果傳回給driver程式。(不過還有一個并行的reducebykey,能傳回一個分布式資料集)

spark中的所有轉換都是惰性的,也就是說,他們并不會直接計算結果。相反的,它們隻是記住應用到基礎資料集(例如一個檔案)上的這些轉換動作。隻有當發生一個要求傳回結果給driver的動作時,這些轉換才會真正運作。這個設計讓spark更加有效率的運作。例如,我們可以實作:通過map建立的一個新資料集,并在reduce中使用,最終隻傳回reduce的結果給driver,而不是整個大的新資料集。

預設情況下,每一個轉換過的rdd都會在你在它之上執行一個動作時被重新計算。不過,你也可以使用persist(或者cache)方法,持久化一個rdd在記憶體中。在這種情況下,spark将會在叢集中,儲存相關元素,下次你查詢這個rdd時,它将能更快速通路。在磁盤上持久化資料集,或在叢集間複制資料集也是支援的,詳盡的rdd操作請參見 rdd api doc。

資料本地性的意思就是盡量的避免資料在網絡上的傳輸。hadoop的mr之是以慢,頻繁的讀寫hdfs是原因之一,為了解決這個問題,spark将資料都放在了記憶體中(當然這是理想的情況,當記憶體不夠用時資料仍然需要寫到檔案系統中)。但是如果資料需要在網絡上傳輸,也會導緻大量的延時和開銷,畢竟disk io和network io都是叢集的昂貴資源。

資料本地性是盡量将計算移到資料所在的節點上進行。畢竟移動計算要比移動資料所占的網絡資源要少得多。而且,由于spark的延時排程機制,使得spark可以在更大的程度上去做優化。比如,擁有資料的節點目前正被其他的task占用,那麼這種情況是否需要将資料移動到其他的空閑節點呢?答案是不一定。因為如果預測目前節點結束目前任務的時間要比移動資料的時間還要少,那麼排程會等待,直到目前節點可用。

Spark:大資料的電花火石!Spark解決了什麼問題?Why Spark?How Spark?Spark的現狀與未來進一步學習敬請期待

值得慶祝的裡程碑:

·        2009:spark誕生于amplab

·        2010:開源

·        2013年6月:apache孵化器項目

·        2014年2月:apache頂級項目

·        hadoop最大的廠商cloudera宣稱加大spark架構的投入來取代mapreduce

·        hadoop廠商mapr投入spark陣營

·        apache mahout放棄mapreduce,将使用spark作為後續算子的計算平台

·        2014年5月30日spark1.0.0釋出

熟讀源碼永遠是知道真相的唯一方式。尤其是scala語言是如此簡潔,如此易讀。當然了在這之前最好還是讀一下論文,尤其是rdd的,這樣可以讓你有個整體把握整個系統的能力。

shark: sql and rich analytics at scale. reynold xin, joshua rosen, matei zaharia, michael j. franklin, scott shenker, ion stoica. technical report ucb/eecs-2012-214. november 2012.

discretized streams: an efficient and fault-tolerant model for stream processing on large clusters. matei zaharia, tathagata das, haoyuan li, scott shenker, ion stoica. hotcloud 2012. june 2012.

shark: fast data analysis using coarse-grained distributed memory (demo). cliff engle, antonio lupher, reynold xin, matei zaharia, haoyuan li, scott shenker, ion stoica. sigmod 2012. may 2012. best demo award.

resilient distributed datasets: a fault-tolerant abstraction for in-memory cluster computing. matei zaharia, mosharaf chowdhury, tathagata das, ankur dave, justin ma, murphy mccauley, michael j. franklin, scott shenker, ion stoica. technical report ucb/eecs-2011-82. july 2011.

spark: cluster computing with working sets. matei zaharia, mosharaf chowdhury, michael j. franklin, scott shenker, ion stoica. hotcloud 2010. june 2010.

   源碼之前,了無真相。接下來,我将從源碼分析的角度,深入spark内部,來系統學習spark,學習它的架構,學習它的實作。

請您支援:

如果你看到這裡,相信這篇文章對您有所幫助。如果是的話,請為本文投一下票吧: 點選投票,多謝。