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