<b>2.2 spark基礎知識</b>
1.版本變遷
經過4年多的發展,spark目前的版本是1.4.1。我們簡單看看它的版本發展過程。
1)spark誕生于ucberkeley的amp實驗室(2009)。
2)spark正式對外開源(2010年)。
3)spark 0.6.0版本釋出(2012-10-15),進行了大範圍的性能改進,增加了一些新特性,并對standalone部署模式進行了簡化。
4)spark 0.6.2版本釋出(2013-02-07),解決了一些bug,并增強了系統的可用性。
5)spark 0.7.0版本釋出(2013-02-27),增加了更多關鍵特性,例如,python api、spark streaming的alpha版本等。
6)spark 0.7.2版本釋出(2013-06-02),性能改進并解決了一些bug,新增api使用的例子。
7)spark接受進入apache孵化器(2013-06-21)。
8)spark 0.7.3版本釋出(2013-07-16),解決一些bug,更新spark
streaming api等。
9)spark 0.8.0版本釋出(2013-09-25),一些新功能及可用性改進。
10)spark 0.8.1版本釋出(2013-12-19),支援scala 2.9、yarn 2.2、standalone部署模式下排程的高可用性、shuffle的優化等。
11)spark 0.9.0版本釋出(2014-02-02),增加了graphx,機器學習新特性,流式計算新特性,核心引擎優化(外部聚合、加強對yarn的支援)等。
12)spark 0.9.1版本釋出(2014-04-09),增強使用yarn的穩定性,改進scala和python api的奇偶性。
13)spark 1.0.0版本釋出(2014-05-30),spark sql、mllib、graphx和spark
streaming都增加了新特性并進行了優化。spark核心引擎還增加了對安全yarn叢集的支援。
14)spark 1.0.1版本釋出(2014-07-11),增加了spark
sql的新特性和對json資料的支援等。
15)spark 1.0.2版本釋出(2014-08-05),spark核心api及streaming、python、mllib的bug修複。
16)spark 1.1.0版本釋出(2014-09-11)。
17)spark 1.1.1版本釋出(2014-11-26),spark核心api及streaming、python、sql、graphx和mllib的bug修複。
18)spark 1.2.0版本釋出(2014-12-18)。
19)spark 1.2.1版本釋出(2015-02-09),spark核心api及streaming、python、sql、graphx和mllib的bug修複。
20)spark 1.3.0版本釋出(2015-03-13)。
21)spark 1.4.0版本釋出(2015-06-11)。
22)spark 1.4.1版本釋出(2015-07-15),dataframe
api及streaming、python、sql和mllib的bug修複。
2.基本概念
要想對spark有整體性的了解,推薦讀者閱讀matei zaharia的spark論文。此處筆者先介紹spark中的一些概念:
rdd(resillient
distributed dataset):彈性分布式資料集。
task:具體執行任務。task分為shufflemaptask和resulttask兩種。shufflemaptask和resulttask分别類似于hadoop中的map和reduce。
job:使用者送出的作業。一個job可能由一到多個task組成。
stage:job分成的階段。一個job可能被劃分為一到多個stage。
partition:資料分區。即一個rdd的資料可以劃分為多少個分區。
narrowdependency:窄依賴,即子rdd依賴于父rdd中固定的partition。narrow-dependency分為onetoonedependency和rangedependency兩種。
shuffledependency:shuffle依賴,也稱為寬依賴,即子rdd對父rdd中的所有partition都有依賴。
dag(directed acycle
graph):有向無環圖。用于反映各rdd之間的依賴關系。
3. scala與java的比較
spark為什麼要選擇java作為開發語言?筆者不得而知。如果能對二者進行比較,也許能看出一些端倪。表2-1列出了scala與java的比較。
表2-1 scala與java的比較
比項項 scala java
語言類型 面向函數為主,兼有面向對象 面向對象(java8也增加了lambda函數程式設計)
簡潔性 非常簡潔 不簡潔
類型推斷 豐富的類型推斷,例如深度和鍊式的類型推斷、 duck type、隐式類型轉換等,但也是以增加了編譯時長 少量的類型推斷
可讀性 一般,豐富的文法糖導緻的各種奇幻用法,例如方法簽名 好
學習成本 較高 一般
語言特性 非常豐富的文法糖和更現代的語言特性,例如 option、模式比對、使用空格的方法調用 豐富
并發程式設計 使用actor的消息模型 使用阻塞、鎖、阻塞隊列等
通過以上比較似乎仍然無法判斷spark選擇java作為開發語言的原因。由于函數式程式設計更接近計算機思維,是以便于通過算法從大資料中模組化,這應該更符合spark作為大資料架構的理念吧!