spark大數據計算引擎原理深剖(優缺點)-spark簡介

用spark,你僅僅只是調用spark的API肯定是很low的。

今天來講講spark的原理,並且會針對部分源碼進行講解,如有不同意見請聯繫本人交流探討。

目前大數據生態主要部分是Hadoop軟件框架和Spark內存級計算引擎。Hadoop包含四個項目:Hadoop common,HDFS,YARN和MapReduce。點擊這裏有Hadoop詳情安裝教程。 Spark並不是要成爲一個大數據領域的“獨裁者” , 一個人霸佔大數據領域所有的 “地盤” , 而是與Hadoop進行了高度的集成, 兩者可以完美的配合使用。 Hadoop的HDFS、Hive、HBase負責存儲, YARN負責資源調度; Spark負責大數據計算。 實際上, Hadoop+Spark的組合, 是 一種“ double win” 的組合。

Hadoop這裏我就暫時不進行講解,後面會在分類比較中進行詳細的分析。

那麼就說說spark,spark是一種通用的大數據計算引擎,如傳統的MapReduce,hive引擎,Storm流式實時計算引擎一樣(yukang個人理解)。期望使用一個技術堆棧就完美解決大數據領域的各種計算任務。


spark對比MapReduce,hive引擎,Storm流式計算引擎優點和缺點:

1.當然如果數據超過1T了基本就不能用spark了,還是會選擇MapReduce,MapReduce利用磁盤的高I/O操作實現並行計算確實在處理海量數據是無法取代的,但它在迭代計算中性能不足。(爲什麼數據過大我不適用spark,spark基於內存大笑好也是內存,不好也是內存,我解釋一下,如果數據過大,OOM內存溢出等等,spark的程序就無法運行了,直接就會報錯掛掉了,這個很坑爹是吧,雖然MapReduce運行數據相對spark很慢,但是至少他可以慢慢的跑不是嗎?再慢至少能跑完。反正我是很討厭BUG的。【這裏提到的MapReduce爲什麼慢後面我也會在後期的Hadoop筆記中詳細解析】)

2.storm實時的流式計算的處理上也是無法取代的(Storm支持在分佈式流式計算程序( Topology) 在運行過程中, 可以動態地調整並行度, 從而動態提高併發處理能力。而Spark Streaming是無法動態調整並行度的。當然Spark Streaming也有其優點是storm不具備的,首先Spark Streaming由於是基於batch進行處理的, 因此相較於Storm基於單條數據 進行處理, 具有數倍甚至數十倍的吞吐量。此外Spark Streaming由於也身處於Spark生態圈內, 因此Spark Streaming可以與Spark Core、 Spark SQL, 甚至是 Spark MLlib、 Spark GraphX進行無縫整合。【業務場景的話:通常在對實時性要求特別高, 而且實時數據量不穩定, 比如在白天有高峯期的情況下, 可以選擇 使用Storm。 但是如果是對實時性要求一般, 允許1秒的準實時處理使用Spark Streaming。我在數據清洗的時候用的Storm,個人原因,其他業務場景我暫時想不起來。】)。

3.海量數據的查詢,hive肯定也是不可取代的,(很多人認爲Spark SQL完全能夠替代Hive的查詢引擎,我認爲肯定是不行的,因爲Hive是一種基於HDFS的數據倉庫, 並且提供了基於SQL模型的, 針對 存儲了大數據的數據倉庫, 進行分佈式交互查詢的查詢引擎,有少量的Hive支持的高級特性,Spark SQL暫時還不支持。當然Spark SQL相較於Hive查詢引擎來說, 就是速度快,原因還是因爲hive底層基於MapReduce,爲什麼MapReduce慢yukang再次不做解釋,後期Hadoop有關筆記會進行詳細解析,Spark SQL相對於hive還有另一個優勢:就是支持大量不同的數據源, 包括hive、 json、 parquet、 jdbc等等。)


spark優勢:

1.spark是基於內存的計算,硬盤由於物理級限制速度提升非常困難,遠遠跟不上CPU和內存的發展速度。近幾十年來,內存的發展一直遵循摩爾定律,價格在下降,內存在增加。現在主流的服務器,幾百GB或幾TB的內存都很常見,內存的發展使得內存數據庫得以實現,Spark正是利用這種計算資源設計的基於內存的分佈式處理軟件,其目標是取代MapReduce。


2.Spark可以直接對HDFS進行數據讀寫,支持YARN等部署模式。(可見其兼容性的強大)


3.spark計算處理數據速度快,因爲它是基於內存啊,(Spark將迭代過程的中間數據緩存到內存中,根據需要多次重複使用。[在機器學習這種需要反覆迭代的任務中非常有效])


4.Spark利用RDD結構提升了容錯性能。(RDD是一個包含諸多元素、被劃分到不同節點上進行並行處理的數據集合,可以將RDD持久化到內存中,這樣就可以有效地在並行操作中複用,在節點發生錯誤時RDD也可以根據其Lineage自動重新計算恢復,如果Lineage很長,可以緩存RDD來提高效率。)


5.同時在磁盤和內存中保存數據。


6.運算方面通過映射,化簡,鏈接,Cogroup等等方式。


7.Spark包含了大數據領域常見的各種計算框架, 比如: 


               Spark Core用於離線計算  


               Spark SQL用於交互式查詢 
               Spark Streaming用於實時流式計算 


               Spark MLlib用於機器學習 


               Spark GraphX用於圖計算 


8.強大的社區和多語言的支持等等。


Spark工作架構:

Spark可以分爲1個driver(筆記本電腦或者集羣網關機器上,用戶編寫的Spark程序)和若干個executor(在RDD分佈的各個節點上)。 
通過SparkContext(簡稱sc)連接Spark集羣、創建RDD、累加器(accumlator)、廣播變量(broadcast variables),簡單可以認爲SparkContext是Spark程序的根本。 
Driver會把計算任務分成一系列小的task,然後送到executor執行。executor之間可以通信,在每個executor完成自己的task以後,所有的信息會被傳回。 


本圖片來源網絡

1. Client客戶端:我們在本地編寫了spark程序,打成jar包,或python腳本,通過spark submit命令提交到Spark集羣; 
2. 只有Spark程序在Spark集羣上運行才能拿到Spark資源,來讀取數據源的數據進入到內存裏; 
3. 客戶端就在Spark分佈式內存中並行迭代地處理數據,注意每個處理過程都是在內存中並行迭代完成;注意:每一批節點上的每一批數據,實際上就是一個RDD!!!一個RDD是分佈式的,所以數據都散落在一批節點上了,每個節點都存儲了RDD的部分partition。 
4. Spark與MapReduce最大的不同在於,迭代式計算模型:MapReduce,分爲兩個階段,map和reduce,兩個階段完了,就結束了,所以我們在一個job裏能做的處理很有限; Spark,計算模型,可以分爲n個階段,因爲它是內存迭代式的。我們在處理完一個階段以後,可以繼續往下處理很多個階段,而不只是兩個階段。所以,Spark相較於MapReduce來說,計算模型可以提供更強大的功能。

spark的生態系統:


 Mesos和yarn 作用一樣,資源調度平臺,用yarn的比較多
Tachyon:(1)內存當中hdfs(內存中的分佈式存儲系統,加快spark在內存中讀取和處理速度)
             (2)在不同應用程序之間實現數據共享
spark core:spark的核心,用於離線計算



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章