1. Spark是什么
2. Spark生態(tài)圈
3. Spark的優(yōu)點(diǎn)
致謝
首先,,簡(jiǎn)單介紹一下分享者Sameer Farooqui。
Sameer是就職于Databricks的客戶服務(wù)工程師,,專注于Spark相關(guān)的技術(shù)支持,、咨詢和培訓(xùn)。在加入Databricks之前,,他以大數(shù)據(jù)培訓(xùn)師和咨詢師的自由職業(yè)者身份,,在全球范圍內(nèi)進(jìn)行了超過(guò)120多次以大數(shù)據(jù)為主題的教學(xué),內(nèi)容包括Hadoop,HDFS,,MapReduce,,Hive,Pig,,HBase等等,。在成為自由職業(yè)者之前,Sameer曾在Hortonworks,,Accenture R&D和Symantec工作過(guò),。
1.什么是Spark
介紹完Sameer的技術(shù)背景之后,我們回到Spark上,,看看什么人在學(xué)習(xí)Spark,。
可以看到其中絕大多數(shù)是開發(fā)者,其次是數(shù)據(jù)科學(xué)家,。開發(fā)者很多容易理解,,但為什么還有不少數(shù)據(jù)科學(xué)家學(xué)習(xí)呢?因?yàn)镾park對(duì)數(shù)據(jù)分析非常有幫助,,它提供的機(jī)器學(xué)習(xí)庫(kù)MLib不僅包括一些基礎(chǔ)的統(tǒng)計(jì)算法,,還有分類(Classification)、回歸(Regression),、聚類(Clustering)等等分析工具,,能夠?qū)⒋髷?shù)據(jù)分析和處理的問(wèn)題簡(jiǎn)單化。
另外我們?cè)賮?lái)看看跟Spark相關(guān)的各種大數(shù)據(jù)平臺(tái)的火爆程度,。
從上面可以看到,,HDFS名列前茅,。因?yàn)榇鎯?chǔ)大數(shù)據(jù),,最穩(wěn)定最可靠的就是HDFS。而且Hadoop相關(guān)的很多技術(shù),,像MapReduce,,HDFS,YARN等等,,支持它們的底層文件系統(tǒng)就是HDFS,。同時(shí)我們可以看到MapReduce,YARN,,Kafka,,HBase,Cassandra,,Hive,,Pig,ZooKeeper,,MongoDB, Oozie等這些技術(shù)也很熱門,。
其實(shí)我們上面提到的各種技術(shù)框架,,可以劃分為兩個(gè)領(lǐng)域的戰(zhàn)爭(zhēng),一個(gè)是偏向底層存儲(chǔ)的戰(zhàn)爭(zhēng),,一個(gè)是偏向計(jì)算的戰(zhàn)爭(zhēng),。
偏向存儲(chǔ)的戰(zhàn)爭(zhēng)有關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)(Relational vs NoSQL)的戰(zhàn)爭(zhēng),它們兩者都有各自的應(yīng)用特點(diǎn),。關(guān)系型數(shù)據(jù)庫(kù)最大的特點(diǎn)是事務(wù)的一致性,,讀寫操作都是事務(wù)的,具有ACID的特點(diǎn),,它在銀行這樣對(duì)一致性有要求的系統(tǒng)中應(yīng)用廣泛,。而非關(guān)系型數(shù)據(jù)庫(kù)一般對(duì)一致性要求不高,但支持高性能并發(fā)讀寫,,海量數(shù)據(jù)訪問(wèn),,在微博、Facebook這類SNS應(yīng)用中廣泛使用,。另外,,非關(guān)系型數(shù)據(jù)庫(kù)內(nèi)部也有戰(zhàn)爭(zhēng),比如說(shuō)HBase和Cassandra,,前者注重一致性(Consistency)和可用性(Availability),,后者提供可用性(Availability)和分區(qū)容錯(cuò)性(Partition tolerance)。Redis和Memcached,,它們都是內(nèi)存內(nèi)的Key/Value存儲(chǔ),,但Redis還支持哈希表,有序集和鏈表等多種數(shù)據(jù)結(jié)構(gòu),。MongoDB,,CouchDB和Couchbase這三個(gè)文檔型數(shù)據(jù)庫(kù),MongoDB更適用于需要?jiǎng)討B(tài)查詢的場(chǎng)景,,CouchDB偏向于預(yù)定義查詢,,Couchbase比CouchDB有更強(qiáng)的一致性,而且還可以作為Key/Value存儲(chǔ),。搜索引擎Solr和Elasticsearch的,,它們都是基于Lucene,性能上相近,,但是前者在Java/C#開發(fā)者中大受歡迎,,而后者深受Python/PHP開發(fā)者喜愛。
偏向計(jì)算的戰(zhàn)爭(zhēng)有MapReduce和Spark之間的戰(zhàn)爭(zhēng),,它們之間的特點(diǎn)在下文有更詳細(xì)介紹,。此外還有Spark Streaming和Storm之間的戰(zhàn)爭(zhēng)等等。
這些戰(zhàn)爭(zhēng)的贏家是誰(shuí)呢?它們是Redis,MongoDB,,Cassandra,,Neo4j和Solr。
簡(jiǎn)單介紹Spark相關(guān)技術(shù)后,,我們回到Spark上,。它是怎么來(lái)的呢?這一切都從谷歌的三篇論文(Google File System,,Map Reduce,,Bigtable)開始。這三篇論文發(fā)布后,,很多人開始進(jìn)行學(xué)習(xí),,并在此基礎(chǔ)上開發(fā)出各種Hadoop計(jì)算平臺(tái),進(jìn)行通用批處理計(jì)算(General Batch Processing),。之后,,人們針對(duì)各種不同的計(jì)算模型開發(fā)了各種專門系統(tǒng)(Specialized Systems),比如說(shuō)迭代式的,,機(jī)器學(xué)習(xí)的,,流處理的,圖像的和SQL相關(guān)的系統(tǒng),。最后就是Spark,,它作為一種通用的統(tǒng)一的計(jì)算引擎(General Unified Engine),希望能夠一統(tǒng)江湖,。
2.Spark生態(tài)圈
為了理解Spark,,我們來(lái)看看Spark生態(tài)圈。
從內(nèi)往外看,,生態(tài)圈核心是Spark Core,,包括各種Spark的各種核心組件,它們能夠?qū)?nèi)存和硬盤進(jìn)行操作,,或者調(diào)用CPU進(jìn)行計(jì)算,。
緊鄰核心圈的是與Spark相關(guān)的各類接口,,比如Java,,Python和R等。
這些接口的外部是針對(duì)不同類型數(shù)據(jù)的計(jì)算引擎,。比如說(shuō)針對(duì)關(guān)系型數(shù)據(jù)進(jìn)行處理的Spark SQL,,針對(duì)對(duì)流數(shù)據(jù)進(jìn)行打包批量處理的Spark Steam,針對(duì)Machine Learning相關(guān)的庫(kù)MLib,,針對(duì)圖的GraphX,,以及針對(duì)大規(guī)模數(shù)據(jù)進(jìn)行采樣和計(jì)算從而縮短計(jì)算時(shí)間的BlinkDB。
再往外就是Spark運(yùn)行的各種場(chǎng)景。比如說(shuō)單機(jī)運(yùn)行,,在Yarn上進(jìn)行管理運(yùn)行等等,。
最外層就涉及基礎(chǔ)數(shù)據(jù)存儲(chǔ)。我們可以用文檔型數(shù)據(jù)庫(kù),,關(guān)系型數(shù)據(jù)庫(kù),,圖數(shù)據(jù)庫(kù)等等。所有這些數(shù)據(jù)存儲(chǔ)系統(tǒng)Spark都能訪問(wèn),,這歸功于Techyon,。它對(duì)底層不同的數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行封裝,提供統(tǒng)一的API進(jìn)行訪問(wèn),。它還可以看作是是對(duì)底層數(shù)據(jù)的緩存,,更多關(guān)于Techyon的內(nèi)容可以參照深入淺出Techyon。
我們?cè)賮?lái)看看Spark生態(tài)圈的各個(gè)部分跟傳統(tǒng)Hadoop系統(tǒng)的對(duì)應(yīng)關(guān)系,。
由上圖可見,,Hadoop MapReduce對(duì)應(yīng)Spark核心,Yarn對(duì)應(yīng)Mesos,,HDFS對(duì)應(yīng)Tachyon等等,。
3.Spark的優(yōu)點(diǎn)
Spark最重要優(yōu)點(diǎn)就是快。為什么Spark比較快呢,?我們來(lái)看看下圖,。
傳統(tǒng)Hadoop計(jì)算過(guò)程中,MapReduce任務(wù)需要跑很多次,,需要多次迭代,,每次迭代計(jì)算的結(jié)果都需要存下來(lái),存到HDFS,,而HDFS本身就是一些硬盤,,所以本質(zhì)上就是把每次計(jì)算的結(jié)果存到硬盤上。而且存到硬盤上還需要考慮備份,,一般是三次備份,。于是計(jì)算總時(shí)間中一大部分將花到硬盤存儲(chǔ)上。之前我們提到程序運(yùn)行時(shí)間,,知道它包括四個(gè)因素:計(jì)算時(shí)間,,數(shù)據(jù)傳輸時(shí)間,任務(wù)調(diào)度時(shí)間,,和并行度,。在傳統(tǒng)MapReduce計(jì)算當(dāng)中,存儲(chǔ)占用了大部分時(shí)間,。而Spark不同,,它是將中間計(jì)算的結(jié)果放在內(nèi)存當(dāng)中,,然后在內(nèi)存中進(jìn)行迭代計(jì)算,速度自然更快,。另外,,Spark還存下了計(jì)算結(jié)果從何而來(lái),即Lineage,。如果內(nèi)存數(shù)據(jù)丟失,,通過(guò)Lineage再找父母要,再計(jì)算一遍,。雖然重復(fù)計(jì)算丟失的數(shù)據(jù)將花費(fèi)較多時(shí)間,,但是數(shù)據(jù)丟失的概率很低,所有Spark整體計(jì)算的速度將提升10到100倍,。
我們?cè)賮?lái)看看Spark之所以快的一些數(shù)字,。
由上圖可見,CPU直接訪問(wèn)內(nèi)存,,速度將達(dá)到10GB/s,。而訪問(wèn)本地硬盤,速度降為100MB/s,,跟訪問(wèn)內(nèi)存的速度相差100倍,。如果訪問(wèn)SSD硬盤,速度可以達(dá)到600MB/s,,但是SSD的價(jià)格很高,。如果是同機(jī)架網(wǎng)絡(luò)訪問(wèn),速度差不多是125MB/s,,比訪問(wèn)本地硬盤還要稍快一些,。而如果是跨機(jī)架網(wǎng)絡(luò)訪問(wèn),速度僅為12.5MB/s,。
如果你想了解更多關(guān)于Spark的內(nèi)容,,可以閱讀相關(guān)論文和書籍。比如說(shuō)《Spark: Cluster Computing with Working Sets》,,《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》,,《Learning Spark》和《Advanced Analytics with Spark》。
總結(jié)
Spark是一個(gè)支持任務(wù)調(diào)度,,監(jiān)控及分布式部署的通用計(jì)算引擎,,它通過(guò)內(nèi)存內(nèi)運(yùn)算技術(shù)和計(jì)算關(guān)系的血統(tǒng)來(lái)提升運(yùn)算速度。
下期預(yù)告
1. RDD是什么,?
2. Spark是如何執(zhí)行任務(wù)的,?
3. Spark的運(yùn)行環(huán)境是怎樣的,?
參考資料
1. https://spark-summit.org/2015/speakers/sameer-farooqui/
2. https://www./videos/vhPmQZzBsM8vv7Tnb/HbcfjrPGxJHvKyzQR
本文作者:Lion,,更多精彩內(nèi)容,,歡迎訪問(wèn)官網(wǎng) http://BitTiger.io 或關(guān)注 “論碼農(nóng)的自我修養(yǎng)” 微信公眾號(hào):bit_tiger
http://weixin.qq.com/r/v0MnP17ERQM6rRpc9xat (二維碼自動(dòng)識(shí)別)