Spark的前世今生

Spark是什么?

Spark,是一種通用的大數(shù)據(jù)計(jì)算框架,正如傳統(tǒng)大數(shù)據(jù)技術(shù)Hadoop的MapReduce、Hive引擎,以及Storm流式實(shí)時(shí)計(jì)算引擎等。

Spark包含了大數(shù)據(jù)領(lǐng)域常見(jiàn)的各種計(jì)算框架:比如Spark Core用于離線計(jì)算,Spark SQL用于交互式查詢(xún),Spark Streaming用于實(shí)時(shí)流式計(jì)算,Spark MLlib用于機(jī)器學(xué)習(xí),Spark GraphX用于圖計(jì)算。

Spark主要用于大數(shù)據(jù)的計(jì)算,而Hadoop以后主要用于大數(shù)據(jù)的存儲(chǔ)(比如HDFS、Hive、HBase等),以及資源調(diào)度(Yarn)。

Spark+Hadoop的組合,是未來(lái)大數(shù)據(jù)領(lǐng)域最熱門(mén)的組合,也是最有前景的組合!

Spark的介紹

Spark,是一種"One Stack to rule them all"的大數(shù)據(jù)計(jì)算框架,期望使用一個(gè)技術(shù)堆棧就完美地解決大數(shù)據(jù)領(lǐng)域的各種計(jì)算任務(wù)。Apache官方,對(duì)Spark的定義就是:通用的大數(shù)據(jù)快速處理引擎。

Spark使用Spark RDD、Spark SQL、Spark Streaming、MLlib、GraphX成功解決了大數(shù)據(jù)領(lǐng)域中,離線批處理、交互式查詢(xún)、實(shí)時(shí)流計(jì)算、機(jī)器學(xué)習(xí)與圖計(jì)算等最重要的任務(wù)和問(wèn)題。

Spark除了一站式的特點(diǎn)之外,另外一個(gè)最重要的特點(diǎn),就是基于內(nèi)存進(jìn)行計(jì)算,從而讓它的速度可以達(dá)到MapReduce、Hive的數(shù)倍甚至數(shù)十倍!

現(xiàn)在已經(jīng)有很多大公司正在生產(chǎn)環(huán)境下深度地使用Spark作為大數(shù)據(jù)的計(jì)算框架,包括eBay、Yahoo!、BAT、網(wǎng)易、京東、華為、大眾點(diǎn)評(píng)、優(yōu)酷土豆、搜狗等等。

Spark同時(shí)也獲得了多個(gè)世界頂級(jí)IT廠商的支持,包括IBM、Intel等。


大數(shù)據(jù)體系概覽(Spark的地位).png

Spark整體架構(gòu)

Spark的歷史沿革

2009年,Spark誕生于伯克利大學(xué)的AMPLab實(shí)驗(yàn)室。最出Spark只是一個(gè)實(shí)驗(yàn)性的項(xiàng)目,代碼量非常少,屬于輕量級(jí)的框架。

2010年,伯克利大學(xué)正式開(kāi)源了Spark項(xiàng)目。

2013年,Spark成為了Apache基金會(huì)下的項(xiàng)目,進(jìn)入高速發(fā)展期。第三方開(kāi)發(fā)者貢獻(xiàn)了大量的代碼,活躍度非常高。

2014年,Spark以飛快的速度稱(chēng)為了Apache的頂級(jí)項(xiàng)目。

2015年~,Spark在國(guó)內(nèi)IT行業(yè)變得愈發(fā)火爆,大量的公司開(kāi)始重點(diǎn)部署或者使用Spark來(lái)替代MapReduce、Hive、Storm等傳統(tǒng)的大數(shù)據(jù)計(jì)算框架。

Spark的特點(diǎn)

速度快:Spark基于內(nèi)存進(jìn)行計(jì)算(當(dāng)然也有部分計(jì)算基于磁盤(pán),比如shuffle)。

容易上手開(kāi)發(fā):Spark的基于RDD的計(jì)算模型,比Hadoop的基于Map-Reduce的計(jì)算模型要更加易于理解,更加易于上手開(kāi)發(fā),實(shí)現(xiàn)各種復(fù)雜功能,比如二次排序、topn等復(fù)雜操作時(shí),更加便捷。

超強(qiáng)的通用性:Spark提供了Spark RDD、Spark SQL、Spark Streaming、Spark MLlib、Spark GraphX等技術(shù)組件,可以一站式地完成大數(shù)據(jù)領(lǐng)域的離線批處理、交互式查詢(xún)、流式計(jì)算、機(jī)器學(xué)習(xí)、圖計(jì)算等常見(jiàn)的任務(wù)。

集成Hadoop:Spark并不是要成為一個(gè)大數(shù)據(jù)領(lǐng)域的“獨(dú)裁者”,一個(gè)人霸占大數(shù)據(jù)領(lǐng)域所有的“地盤(pán)”,而是與Hadoop進(jìn)行了高度的集成,兩者可以完美的配合使用。Hadoop的HDFS、Hive、HBase負(fù)責(zé)存儲(chǔ),YARN負(fù)責(zé)資源調(diào)度;Spark復(fù)雜大數(shù)據(jù)計(jì)算。實(shí)際上,Hadoop+Spark的組合,是一種“double win”的組合。

極高的活躍度:Spark目前是Apache基金會(huì)的頂級(jí)項(xiàng)目,全世界有大量的優(yōu)秀工程師是Spark的committer。并且世界上很多頂級(jí)的IT公司都在大規(guī)模地使用Spark。

Spark VS MapReduce

MapReduce能夠完成的各種離線批處理功能,以及常見(jiàn)算法(比如二次排序、topn等),基于Spark RDD的核心編程,都可以實(shí)現(xiàn),并且可以更好地、更容易地實(shí)現(xiàn)。而且基于Spark RDD編寫(xiě)的離線批處理程序,運(yùn)行速度是MapReduce的數(shù)倍,速度上有非常明顯的優(yōu)勢(shì)。

Spark相較于MapReduce速度快的最主要原因就在于,MapReduce的計(jì)算模型太死板,必須是map-reduce模式,有時(shí)候即使完成一些諸如過(guò)濾之類(lèi)的操作,也必須經(jīng)過(guò)map-reduce過(guò)程,這樣就必須經(jīng)過(guò)shuffle過(guò)程。而MapReduce的shuffle過(guò)程是最消耗性能的,因?yàn)閟huffle中間的過(guò)程必須基于磁盤(pán)來(lái)讀寫(xiě)。而Spark的shuffle雖然也要基于磁盤(pán),但是其大量transformation操作,比如單純的map或者filter等操作,可以直接基于內(nèi)存進(jìn)行pipeline操作,速度性能自然大大提升。

但是Spark也有其劣勢(shì)。由于Spark基于內(nèi)存進(jìn)行計(jì)算,雖然開(kāi)發(fā)容易,但是真正面對(duì)大數(shù)據(jù)的時(shí)候(比如一次操作針對(duì)10億以上級(jí)別),在沒(méi)有進(jìn)行調(diào)優(yōu)的情況下,可能會(huì)出現(xiàn)各種各樣的問(wèn)題,比如OOM內(nèi)存溢出等等。導(dǎo)致Spark程序可能都無(wú)法完全運(yùn)行起來(lái),就報(bào)錯(cuò)掛掉了,而MapReduce即使是運(yùn)行緩慢,但是至少可以慢慢運(yùn)行完。

此外,Spark由于是新崛起的技術(shù)新秀,因此在大數(shù)據(jù)領(lǐng)域的完善程度,肯定不如MapReduce,比如基于HBase、Hive作為離線批處理程序的輸入輸出,Spark就遠(yuǎn)沒(méi)有MapReduce來(lái)的完善。實(shí)現(xiàn)起來(lái)非常麻煩。


Spark vs MapReduce的計(jì)算模型(內(nèi)存).png

Spark SQL VS Hive

Spark SQL實(shí)際上并不能完全替代Hive,因?yàn)镠ive是一種基于HDFS的數(shù)據(jù)倉(cāng)庫(kù),并且提供了基于SQL模型的,針對(duì)存儲(chǔ)了大數(shù)據(jù)的數(shù)據(jù)倉(cāng)庫(kù),進(jìn)行分布式交互查詢(xún)的查詢(xún)引擎。

嚴(yán)格的來(lái)說(shuō),Spark SQL能夠替代的,是Hive的查詢(xún)引擎,而不是Hive本身,實(shí)際上即使在生產(chǎn)環(huán)境下,Spark SQL也是針對(duì)Hive數(shù)據(jù)倉(cāng)庫(kù)中的數(shù)據(jù)進(jìn)行查詢(xún),Spark本身自己是不提供存儲(chǔ)的,自然也不可能替代Hive作為數(shù)據(jù)倉(cāng)庫(kù)的這個(gè)功能。

Spark SQL的一個(gè)優(yōu)點(diǎn),相較于Hive查詢(xún)引擎來(lái)說(shuō),就是速度快,同樣的SQL語(yǔ)句,可能使用Hive的查詢(xún)引擎,由于其底層基于MapReduce,必須經(jīng)過(guò)shuffle過(guò)程走磁盤(pán),因此速度是非常緩慢的。很多復(fù)雜的SQL語(yǔ)句,在hive中執(zhí)行都需要一個(gè)小時(shí)以上的時(shí)間。而Spark SQL由于其底層基于Spark自身的基于內(nèi)存的特點(diǎn),因此速度達(dá)到了Hive查詢(xún)引擎的數(shù)倍以上。

但是Spark SQL由于與Spark一樣,是大數(shù)據(jù)領(lǐng)域的新起的新秀,因此還不夠完善,有少量的Hive支持的高級(jí)特性,Spark SQL還不支持,導(dǎo)致Spark SQL暫時(shí)還不能完全替代Hive的查詢(xún)引擎。而只能在部分Spark SQL功能特性可以滿(mǎn)足需求的場(chǎng)景下,進(jìn)行使用。

而Spark SQL相較于Hive的另外一個(gè)優(yōu)點(diǎn),就是支持大量不同的數(shù)據(jù)源,包括hive、json、parquet、jdbc等等。此外,Spark SQL由于身處Spark技術(shù)堆棧內(nèi),也是基于RDD來(lái)工作,因此可以與Spark的其他組件無(wú)縫整合使用,配合起來(lái)實(shí)現(xiàn)許多復(fù)雜的功能。比如Spark SQL支持可以直接針對(duì)hdfs文件執(zhí)行sql語(yǔ)句!


Spark SQL和Hive的關(guān)系.png

Spark Streaming VS Storm

Spark Streaming與Storm都可以用于進(jìn)行實(shí)時(shí)流計(jì)算。但是他們兩者的區(qū)別是非常大的。其中區(qū)別之一,就是,Spark Streaming和Storm的計(jì)算模型完全不一樣,Spark Streaming是基于RDD的,因此需要將一小段時(shí)間內(nèi)的,比如1秒內(nèi)的數(shù)據(jù),收集起來(lái),作為一個(gè)RDD,然后再針對(duì)這個(gè)batch的數(shù)據(jù)進(jìn)行處理。而Storm卻可以做到每來(lái)一條數(shù)據(jù),都可以立即進(jìn)行處理和計(jì)算。因此,Spark Streaming實(shí)際上嚴(yán)格意義上來(lái)說(shuō),只能稱(chēng)作準(zhǔn)實(shí)時(shí)的流計(jì)算框架;而Storm是真正意義上的實(shí)時(shí)計(jì)算框架。

此外,Storm支持的一項(xiàng)高級(jí)特性,是Spark Streaming暫時(shí)不具備的,即Storm支持在分布式流式計(jì)算程序(Topology)在運(yùn)行過(guò)程中,可以動(dòng)態(tài)地調(diào)整并行度,從而動(dòng)態(tài)提高并發(fā)處理能力。而Spark Streaming是無(wú)法動(dòng)態(tài)調(diào)整并行度的。

但是Spark Streaming也有其優(yōu)點(diǎn),首先Spark Streaming由于是基于batch進(jìn)行處理的,因此相較于Storm基于單條數(shù)據(jù)進(jìn)行處理,具有數(shù)倍甚至數(shù)十倍的吞吐量。

此外,Spark Streaming由于也身處于Spark生態(tài)圈內(nèi),因此Spark Streaming可以與Spark Core、Spark SQL,甚至是Spark MLlib、Spark GraphX進(jìn)行無(wú)縫整合。流式處理完的數(shù)據(jù),可以立即進(jìn)行各種map、reduce轉(zhuǎn)換操作,可以立即使用sql進(jìn)行查詢(xún),甚至可以立即使用machine learning或者圖計(jì)算算法進(jìn)行處理。這種一站式的大數(shù)據(jù)處理功能和優(yōu)勢(shì),是Storm無(wú)法匹敵的。

因此,綜合上述來(lái)看,通常在對(duì)實(shí)時(shí)性要求特別高,而且實(shí)時(shí)數(shù)據(jù)量不穩(wěn)定,比如在白天有高峰期的情況下,可以選擇使用Storm。但是如果是對(duì)實(shí)時(shí)性要求一般,允許1秒的準(zhǔn)實(shí)時(shí)處理,而且不要求動(dòng)態(tài)調(diào)整并行度的話,選擇Spark Streaming是更好的選擇。


Spark Streaming和Storm的計(jì)算模型對(duì)比.png

Spark的個(gè)人使用體會(huì)

首先,Spark目前來(lái)說(shuō),相較于MapReduce來(lái)說(shuō),可以立即替代的,并且會(huì)產(chǎn)生非常理想的效果的場(chǎng)景,就是要求低延時(shí)的復(fù)雜大數(shù)據(jù)交互式計(jì)算系統(tǒng)。比如某些大數(shù)據(jù)系統(tǒng),可以根據(jù)用戶(hù)提交的各種條件,立即定制執(zhí)行復(fù)雜的大數(shù)據(jù)計(jì)算系統(tǒng),并且要求低延時(shí)(一小時(shí)以?xún)?nèi))即可以出來(lái)結(jié)果,并通過(guò)前端頁(yè)面展示效果。在這種場(chǎng)景下,對(duì)速度比較敏感的情況下,非常適合立即使用Spark替代MapReduce。因?yàn)镾park編寫(xiě)的離線批處理程序,如果進(jìn)行了合適的性能調(diào)優(yōu)之后,速度可能是MapReduce程序的十幾倍。從而達(dá)到用戶(hù)期望的效果。

其次,相對(duì)于Hive來(lái)說(shuō),對(duì)于某些需要根據(jù)用戶(hù)選擇的條件,動(dòng)態(tài)拼接SQL語(yǔ)句,進(jìn)行某類(lèi)特定查詢(xún)統(tǒng)計(jì)任務(wù)的系統(tǒng),其實(shí)類(lèi)似于上述的系統(tǒng)。此時(shí)也要求低延時(shí),甚至希望達(dá)到幾分鐘之內(nèi)。此時(shí)也可以使用Spark SQL替代Hive查詢(xún)引擎。因此場(chǎng)景比較固定,SQL語(yǔ)句的語(yǔ)法比較固定,清楚肯定不會(huì)使用到Spark SQL所不支持的Hive語(yǔ)法特性。此時(shí)使用Hive查詢(xún)引擎可以需要幾十分鐘執(zhí)行一個(gè)復(fù)雜SQL。而使用Spark SQl,可能只需要使用幾分鐘??梢赃_(dá)到用戶(hù)期望的效果

最后,對(duì)于Storm來(lái)說(shuō),如果僅僅要求對(duì)數(shù)據(jù)進(jìn)行簡(jiǎn)單的流式計(jì)算處理,那么選擇storm或者spark streaming都無(wú)可厚非。但是如果需要對(duì)流式計(jì)算的中間結(jié)果(RDD),進(jìn)行復(fù)雜的后續(xù)處理,則使用Spark更好,因?yàn)镾park本身提供了很多原語(yǔ),比如map、reduce、groupByKey、filter等等。

Spark目前在國(guó)內(nèi)的現(xiàn)狀以及未來(lái)的展望

Spark目前在國(guó)內(nèi)正在飛速地發(fā)展,并且在很多領(lǐng)域,以及慢慢開(kāi)始替代傳統(tǒng)得一些基于Hadoop的組件。比如BAT、京東、搜狗等知名的互聯(lián)網(wǎng)企業(yè),都在深度的,大規(guī)模地使用Spark。

但是,大家如果去觀察一下一些招聘網(wǎng)站對(duì)大數(shù)據(jù)的招聘需求,就會(huì)發(fā)現(xiàn),目前來(lái)說(shuō),由于大部分還是大公司在使用Spark,因此大部分中小型企業(yè),還是主要在使用Hadoop進(jìn)行大數(shù)據(jù)處理。在招聘時(shí),還是主要以hadoop工程師為主。Spark以及Storm的招聘還是相對(duì)Hadoop來(lái)說(shuō),會(huì)少一些。

但是,大家如果通過(guò)本堂課的講解,能夠較為全面地對(duì)Spark有一個(gè)感性得認(rèn)識(shí),就能意識(shí)到,Spark在大數(shù)據(jù)領(lǐng)域中,是未來(lái)的一個(gè)趨勢(shì)和方向。隨著Spark、Spark SQL以及Spark Streaming慢慢成熟,就會(huì)慢慢替代掉Hadoop的MapReduce、Hive查詢(xún)等。大家可以想想,如果兩者都能夠?qū)崿F(xiàn)相同的功能,而Spark甚至以后還可以做的更好,速度要快好幾倍,甚至好幾十倍。那么還有誰(shuí)會(huì)愿意使用MapReduce或Hive查詢(xún)引擎呢?

實(shí)際上,根據(jù)我在國(guó)內(nèi)一線互聯(lián)網(wǎng)公司這幾年的工作和觀察,以及通過(guò)與行業(yè)內(nèi)各個(gè)規(guī)模公司的朋友交流,認(rèn)為,未來(lái)的主流,一定是hadoop+Spark的這種組合,double win的格局。hadoop的特長(zhǎng),就是hdfs,分布式存儲(chǔ),基于此之上的是Hive作為大數(shù)據(jù)的數(shù)據(jù)倉(cāng)庫(kù),HBase作為大數(shù)據(jù)的實(shí)時(shí)查詢(xún)NoSQL數(shù)據(jù)庫(kù),YARN作為通用的資源調(diào)度框架;而Spark,則發(fā)揮它的特長(zhǎng),將各種各樣的大數(shù)據(jù)計(jì)算模型匯聚在一個(gè)技術(shù)堆棧內(nèi),對(duì)hadoop上的大數(shù)據(jù)進(jìn)行各種計(jì)算處理!

因此,大家也可以看到,Spark目前正在變得越來(lái)越火爆,招聘的企業(yè)正在越來(lái)越多,而且目前國(guó)內(nèi)spark人才可以說(shuō)是稀缺?。。≡谀壳?,以及未來(lái),完全供不應(yīng)求!因此這種趨勢(shì),以及這種現(xiàn)狀,就決定了,對(duì)于我們個(gè)人來(lái)說(shuō),目前進(jìn)行spark的學(xué)習(xí)以及研究,完全是未來(lái)一個(gè)獲取快速升值的機(jī)會(huì)?。?!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容