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)行了超過120多次以大數(shù)據(jù)為主題的教學(xué),內(nèi)容包括Hadoop,HDFS,MapReduce,Hive,Pig,HBase等等。在成為自由職業(yè)者之前,Sameer曾在Hortonworks,Accenture R&D和Symantec工作過。
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ù)分析和處理的問題簡(jiǎn)單化。
另外我們?cè)賮砜纯锤鶶park相關(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ù)訪問,在微博、Facebook這類SNS應(yīng)用中廣泛使用。另外,非關(guān)系型數(shù)據(jù)庫(kù)內(nèi)部也有戰(zhàn)爭(zhēng),比如說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)的贏家是誰呢?它們是Redis,MongoDB,Cassandra,Neo4j和Solr。
簡(jiǎn)單介紹Spark相關(guān)技術(shù)后,我們回到Spark上。它是怎么來的呢?這一切都從谷歌的三篇論文(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),比如說迭代式的,機(jī)器學(xué)習(xí)的,流處理的,圖像的和SQL相關(guān)的系統(tǒng)。最后就是Spark,它作為一種通用的統(tǒng)一的計(jì)算引擎(General Unified Engine),希望能夠一統(tǒng)江湖。
2.Spark生態(tài)圈
為了理解Spark,我們來看看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ì)算引擎。比如說針對(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)景。比如說單機(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都能訪問,這歸功于Techyon。它對(duì)底層不同的數(shù)據(jù)存儲(chǔ)系統(tǒng)進(jìn)行封裝,提供統(tǒng)一的API進(jìn)行訪問。它還可以看作是是對(duì)底層數(shù)據(jù)的緩存,更多關(guān)于Techyon的內(nèi)容可以參照深入淺出Techyon。
我們?cè)賮砜纯碨park生態(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比較快呢?我們來看看下圖。
傳統(tǒng)Hadoop計(jì)算過程中,MapReduce任務(wù)需要跑很多次,需要多次迭代,每次迭代計(jì)算的結(jié)果都需要存下來,存到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é)果從何而來,即Lineage。如果內(nèi)存數(shù)據(jù)丟失,通過Lineage再找父母要,再計(jì)算一遍。雖然重復(fù)計(jì)算丟失的數(shù)據(jù)將花費(fèi)較多時(shí)間,但是數(shù)據(jù)丟失的概率很低,所有Spark整體計(jì)算的速度將提升10到100倍。
我們?cè)賮砜纯碨park之所以快的一些數(shù)字。
由上圖可見,CPU直接訪問內(nèi)存,速度將達(dá)到10GB/s。而訪問本地硬盤,速度降為100MB/s,跟訪問內(nèi)存的速度相差100倍。如果訪問SSD硬盤,速度可以達(dá)到600MB/s,但是SSD的價(jià)格很高。如果是同機(jī)架網(wǎng)絡(luò)訪問,速度差不多是125MB/s,比訪問本地硬盤還要稍快一些。而如果是跨機(jī)架網(wǎng)絡(luò)訪問,速度僅為12.5MB/s。
如果你想了解更多關(guān)于Spark的內(nèi)容,可以閱讀相關(guān)論文和書籍。比如說《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ì)算引擎,它通過內(nèi)存內(nèi)運(yùn)算技術(shù)和計(jì)算關(guān)系的血統(tǒng)來提升運(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.bittiger.io/videos/vhPmQZzBsM8vv7Tnb/HbcfjrPGxJHvKyzQR
本文作者:Lion,更多精彩內(nèi)容,歡迎訪問官網(wǎng) http://BitTiger.io 或關(guān)注 “論碼農(nóng)的自我修養(yǎng)” 微信公眾號(hào):bit_tiger
http://weixin.qq.com/r/v0MnP17ERQM6rRpc9xat (二維碼自動(dòng)識(shí)別)