Spark是什麼?算法
Spark,是一種通用的大數據計算框架,正如傳統大數據技術Hadoop的MapReduce、Hive引擎,以及Storm流式實時計算引擎等。 Spark包含了大數據領域常見的各類計算框架:好比Spark Core用於離線計算,Spark SQL用於交互式查詢,Spark Streaming用於實時流式計算,Spark MLlib用於機器學習,Spark GraphX用於圖計算。 Spark主要用於大數據的計算,而Hadoop之後主要用於大數據的存儲(好比HDFS、Hive、HBase等),以及資源調度(Yarn)。sql
Spark總體架構編程
Spark的特色:json
·速度快:Spark基於內存進行計算(固然也有部分計算基於磁盤,好比shuffle)。 ·容易上手開發:Spark的基於RDD的計算模型,比Hadoop的基於Map-Reduce的計算模型要更加易於理解,更加易於上手開發,實現各類複雜功能,好比二次排序、topn等複雜操做時,更加便捷。 ·超強的通用性:Spark提供了Spark RDD、Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX等技術組件,能夠一站式地完成大數據領域的離線批處理、交互式查詢、流式計算、機器學習、圖計算等常見的任務。 ·集成Hadoop:Spark並非要成爲一個大數據領域的「獨裁者」,一我的霸佔大數據領域全部的「地盤」,而是與Hadoop進行了高度的集成,二者能夠完美的配合使用。Hadoop的HDFS、Hive、HBase負責存儲,YARN負責資源調度;Spark複雜大數據計算。實際上,Hadoop+Spark的組合,是一種「double win」的組合。架構
Spark VS MapReduce:併發
MapReduce可以完成的各類離線批處理功能,以及常見算法(好比二次排序、topn等),基於Spark RDD的核心編程,均可以實現,而且能夠更好地、更容易地實現。並且基於Spark RDD編寫的離線批處理程序,運行速度是MapReduce的數倍,速度上有很是明顯的優點。 Spark相較於MapReduce速度快的最主要緣由就在於,MapReduce的計算模型太死板,必須是map-reduce模式,有時候即便完成一些諸如過濾之類的操做,也必須通過map-reduce過程,這樣就必須通過shuffle過程。而MapReduce的shuffle過程是最消耗性能的,由於shuffle中間的過程必須基於磁盤來讀寫。而Spark的shuffle雖然也要基於磁盤,可是其大量transformation操做,好比單純的map或者filter等操做,能夠直接基於內存進行pipeline操做,速度性能天然大大提高。 可是Spark也有其劣勢。因爲Spark基於內存進行計算,雖然開發容易,可是真正面對大數據的時候(好比一次操做針對10億以上級別),在沒有進行調優的狀況下,可能會出現各類各樣的問題,好比OOM內存溢出等等。致使Spark程序可能都沒法徹底運行起來,就報錯掛掉了,而MapReduce即便是運行緩慢,可是至少能夠慢慢運行完。 此外,Spark因爲是新崛起的技術新秀,所以在大數據領域的完善程度,確定不如MapReduce,好比基於HBase、Hive做爲離線批處理程序的輸入輸出,Spark就遠沒有MapReduce來的完善。實現起來很是麻煩。框架
Spark SQL VS Hive:機器學習
Spark SQL實際上並不能徹底替代Hive,由於Hive是一種基於HDFS的數據倉庫,而且提供了基於SQL模型的,針對存儲了大數據的數據倉庫,進行分佈式交互查詢的查詢引擎。 嚴格的來講,Spark SQL可以替代的,是Hive的查詢引擎,而不是Hive自己,實際上即便在生產環境下,Spark SQL也是針對Hive數據倉庫中的數據進行查詢,Spark自己本身是不提供存儲的,天然也不可能替代Hive做爲數據倉庫的這個功能。 Spark SQL的一個優勢,相較於Hive查詢引擎來講,就是速度快,一樣的SQL語句,可能使用Hive的查詢引擎,因爲其底層基於MapReduce,必須通過shuffle過程走磁盤,所以速度是很是緩慢的。不少複雜的SQL語句,在hive中執行都須要一個小時以上的時間。而Spark SQL因爲其底層基於Spark自身的基於內存的特色,所以速度達到了Hive查詢引擎的數倍以上。 可是Spark SQL因爲與Spark同樣,是大數據領域的新起的新秀,所以還不夠完善,有少許的Hive支持的高級特性,Spark SQL還不支持,致使Spark SQL暫時還不能徹底替代Hive的查詢引擎。而只能在部分Spark SQL功能特性能夠知足需求的場景下,進行使用。 而Spark SQL相較於Hive的另一個優勢,就是支持大量不一樣的數據源,包括hive、json、parquet、jdbc等等。此外,Spark SQL因爲身處Spark技術堆棧內,也是基於RDD來工做,所以能夠與Spark的其餘組件無縫整合使用,配合起來實現許多複雜的功能。好比Spark SQL支持能夠直接針對hdfs文件執行sql語句!分佈式
Spark Streaming VS Storm:高併發
Spark Streaming與Storm均可以用於進行實時流計算。可是他們二者的區別是很是大的。其中區別之一,就是,Spark Streaming和Storm的計算模型徹底不同,Spark Streaming是基於RDD的,所以須要將一小段時間內的,好比1秒內的數據,收集起來,做爲一個RDD,而後再針對這個batch的數據進行處理。而Storm卻能夠作到每來一條數據,均可以當即進行處理和計算。所以,Spark Streaming實際上嚴格意義上來講,只能稱做準實時的流計算框架;而Storm是真正意義上的實時計算框架。 此外,Storm支持的一項高級特性,是Spark Streaming暫時不具有的,即Storm支持在分佈式流式計算程序(Topology)在運行過程當中,能夠動態地調整並行度,從而動態提升併發處理能力。而Spark Streaming是沒法動態調整並行度的。 可是Spark Streaming也有其優勢,首先Spark Streaming因爲是基於batch進行處理的,所以相較於Storm基於單條數據進行處理,具備數倍甚至數十倍的吞吐量。 此外,Spark Streaming因爲也身處於Spark生態圈內,所以Spark Streaming能夠與Spark Core、Spark SQL,甚至是Spark MLlib、Spark GraphX進行無縫整合。流式處理完的數據,能夠當即進行各類map、reduce轉換操做,能夠當即使用sql進行查詢,甚至能夠當即使用machine learning或者圖計算算法進行處理。這種一站式的大數據處理功能和優點,是Storm沒法匹敵的。 所以,綜合上述來看,一般在對實時性要求特別高,並且實時數據量不穩定,好比在白天有高峯期的狀況下,能夠選擇使用Storm。可是若是是對實時性要求通常,容許1秒的準實時處理,並且不要求動態調整並行度的話,選擇Spark Streaming是更好的選擇。