目錄
一、Spark簡介
(一)定義
(二)Spark和MapReduce區(qū)別
(三)Spark歷史
(四)Spark特點(diǎn)
二、Spark生態(tài)系統(tǒng)
三、Spark運(yùn)行架構(gòu)
(一)基本概念
(二)架構(gòu)設(shè)計(jì)
(三)Spark運(yùn)行基本流程
四、Spark編程模型
(一)核心數(shù)據(jù)結(jié)構(gòu)RDD
(二)RDD上的操作
(三)RDD的特性
(四)RDD 的持久化
(五)RDD之間的依賴關(guān)系?
(六)RDD計(jì)算工作流?
五、Spark的部署方式
一、Spark簡介
(一)定義
????????Spark是一種基于內(nèi)存的、用以實(shí)現(xiàn)高效集群計(jì)算的平臺。準(zhǔn)確地講,Spark是一個(gè)大數(shù)據(jù)并行計(jì)算框架,是對廣泛使用的MapReduce計(jì)算模型的擴(kuò)展。
(二)Spark和MapReduce區(qū)別
????????Spark有著自己的生態(tài)系統(tǒng),但同時(shí)兼容HDFS、Hive等分布式存儲(chǔ)系統(tǒng),可以完美融入Hadoop的生態(tài)圈中,代替MapReduce去執(zhí)行更高的分布式計(jì)算。兩者區(qū)別如圖所示,基于MapReduce的計(jì)算引擎通常會(huì)將中間結(jié)果輸出到磁盤上進(jìn)行存儲(chǔ)和容錯(cuò);而Spark則是將中間結(jié)果盡量保存在內(nèi)存中以減少底層存儲(chǔ)系統(tǒng)的I/O,以提高計(jì)算速度。
????????Spark,擁有Hadoop MapReduce所具有的優(yōu)點(diǎn);但不同于MapReduce的是——Job中間輸出結(jié)果可以保存在內(nèi)存中,從而不再需要讀寫HDFS,因此Spark能更好地適用于數(shù)據(jù)挖掘與機(jī)器學(xué)習(xí)等需要迭代的MapReduce的算法。
????????Spark是一種與 Hadoop 相似的開源集群計(jì)算環(huán)境,但是兩者之間還存在一些不同之處,這些有用的不同之處使 Spark 在某些工作負(fù)載方面表現(xiàn)得更加優(yōu)越,換句話說,Spark 啟用了內(nèi)存分布數(shù)據(jù)集,除了能夠提供交互式查詢外,它還可以優(yōu)化迭代工作負(fù)載。
????????Spark 是在 Scala 語言中實(shí)現(xiàn)的,它將 Scala 用作其應(yīng)用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數(shù)據(jù)集。盡管創(chuàng)建 Spark 是為了支持分布式數(shù)據(jù)集上的迭代作業(yè),但是實(shí)際上它是對 Hadoop 的補(bǔ)充,可以在 Hadoop 文件系統(tǒng)中并行運(yùn)行。通過名為 Mesos 的第三方集群框架可以支持此行為。
(三)Spark歷史
????????Spark最初由美國加州大學(xué)伯克利分校(UC Berkeley)的AMP實(shí)驗(yàn)室于2009年開發(fā),項(xiàng)目采用Scala編寫。是基于內(nèi)存計(jì)算的大數(shù)據(jù)并行計(jì)算框架,可用于構(gòu)建大型的、低延遲的數(shù)據(jù)分析應(yīng)用程序。
????????2010年開源。
????????2013年6月成為Apache孵化項(xiàng)目。2013年Spark加入Apache孵化器項(xiàng)目后發(fā)展迅猛,如今已成為Apache軟件基金會(huì)最重要的三大分布式計(jì)算系統(tǒng)開源項(xiàng)目之一(Hadoop、Spark、Storm)。
????????2014年2月成為Apache頂級項(xiàng)目。Spark在2014年打破了Hadoop保持的基準(zhǔn)排序紀(jì)錄:Spark/206個(gè)節(jié)點(diǎn)/23分鐘/100TB數(shù)據(jù); Hadoop/2000個(gè)節(jié)點(diǎn)/72分鐘/100TB數(shù)據(jù);Spark用十分之一的計(jì)算資源,獲得了比Hadoop快3倍的速度。
(四)Spark特點(diǎn)
1、運(yùn)行速度快:與Hadoop的MapReduce相比,Spark基于內(nèi)存的運(yùn)算要快100倍以上,基于硬盤的運(yùn)算也要快10倍以上。Spark實(shí)現(xiàn)了高效的DAG執(zhí)行引擎,可以通過基于內(nèi)存來高效處理數(shù)據(jù)流。計(jì)算的中間結(jié)果是存在于內(nèi)存中的。
2、易用:Spark支持Java、Python、Scala和R等多種語言的API,還支持超過80種高級算法,使用戶可以快速構(gòu)建不同的應(yīng)用。而且Spark支持交互式的Python和Scala的Shell,可以非常方便地在這些Shell中使用Spark集群來驗(yàn)證解決問題的方法。
3、通用性:Spark提供了統(tǒng)一的解決方案。Spark可以用于批處理、交互式查詢(Spark SQL)、實(shí)時(shí)流處理(Spark Streaming)、機(jī)器學(xué)習(xí)(Spark MLlib)和圖計(jì)算(GraphX)。這些不同類型的處理都可以在同一個(gè)應(yīng)用中無縫使用。減少了開發(fā)和維護(hù)的人力成本和部署平臺的物力成本。
4、兼容性:Spark可以非常方便地與其他的開源產(chǎn)品進(jìn)行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作為它的資源管理和調(diào)度器,并且可以處理所有Hadoop支持的數(shù)據(jù),包括HDFS、HBase等。這對于已經(jīng)部署Hadoop集群的用戶特別重要,因?yàn)椴恍枰鋈魏螖?shù)據(jù)遷移就可以使用Spark的強(qiáng)大處理能力。
二、Spark生態(tài)系統(tǒng)
????????Spark的設(shè)計(jì)遵循“一個(gè)軟件棧滿足不同應(yīng)用場景”的理念,逐漸形成了一套完整的生態(tài)系統(tǒng),既能夠提供內(nèi)存計(jì)算框架,也可以支持SQL即席查詢、實(shí)時(shí)流式計(jì)算、機(jī)器學(xué)習(xí)和圖計(jì)算等。Spark可以部署在資源管理器YARN之上,提供一站式的大數(shù)據(jù)解決方案。因此,Spark所提供的生態(tài)系統(tǒng)足以應(yīng)對上述三種場景,即同時(shí)支持批處理、交互式查詢和流數(shù)據(jù)處理。
????????現(xiàn)在,Spark生態(tài)系統(tǒng)已經(jīng)成為伯克利數(shù)據(jù)分析軟件棧BDAS(Berkeley Data Analytics Stack)的重要組成部分。

Spark的生態(tài)系統(tǒng)主要包含了Spark Core、Spark SQL、Spark Streaming(Structured?Streaming)、MLLib和GraphX等組件。?

1、Spark?Core
????????Spark?Core包含Spark最基礎(chǔ)和最核心的功能,如內(nèi)存計(jì)算、任務(wù)調(diào)度、部模式、故障恢復(fù)、存儲(chǔ)管理等,主要面向批數(shù)據(jù)處理。Spark?Core?建立在統(tǒng)一的抽象RDD?之上,使其可以以基本一致的方式應(yīng)對不同的大數(shù)據(jù)處理場景;需要注意的是,Spark?Core?通常被簡稱為Spark。
2、Spark SQL
????????Spark SQL是用于結(jié)構(gòu)化數(shù)據(jù)處理的組件,允許開發(fā)人員直接處理RDD,同時(shí)也可查詢Hive、HBase等外部數(shù)據(jù)源。Spark SQL的一個(gè)重要特點(diǎn)是其能夠統(tǒng)一處理關(guān)系表和RDD,使得開發(fā)人員不需要自己編寫Spark?應(yīng)用程序,開發(fā)人員可以輕松地使用SOL?命令進(jìn)行查詢,并進(jìn)行更復(fù)雜的數(shù)據(jù)分析。
3、Spark?Streaming
????????Spark?Streaming是一種流計(jì)算框架,可以支持高吞吐量、可容錯(cuò)處理的實(shí)時(shí)流數(shù)據(jù)處理,其核心思路是將流數(shù)據(jù)分解成一系列短小的批處理作業(yè),每個(gè)短小的批處理作業(yè)都可以使用Spark?Core進(jìn)行快速處理。?Spark?Streaming支持多種數(shù)據(jù)輸入源,如Kafka、Flume和TCP套接字等。
4、Structured?Streaming
????????Structured?Streaming是一種基于Spark?SQL引擎構(gòu)建的、可擴(kuò)展且容錯(cuò)的流處理引擎。通過一致的API,?Structured?Streaming?可以使開發(fā)人員像寫批處理程序一樣編寫流處理程序,降低了開發(fā)人員的開發(fā)難度。
5、MLlib(機(jī)器學(xué)習(xí))
????????MLlib提供了常用機(jī)器學(xué)習(xí)算法的實(shí)現(xiàn),包括聚類、分類、回歸、協(xié)同過濾等,降低了機(jī)器學(xué)習(xí)的門檻,開發(fā)人員只需具備一定的理論知識就能進(jìn)行機(jī)器學(xué)習(xí)的工作。
6、GraphX(圖計(jì)算)
????????GraphX是Spark中用圖計(jì)算的API,可認(rèn)為是Pregel在Spark?上的重寫及優(yōu)化,Graphx性能良好,擁有豐富的功能和運(yùn)算符,能在海量數(shù)據(jù)上自如地運(yùn)行復(fù)雜的圖算法。
下表給出了在不同應(yīng)用場景下,可以選用的Spark生態(tài)系統(tǒng)中的組件和其他框架。
應(yīng)用場景 | 時(shí)間跨度 | 其他框架 | Spark生態(tài)系統(tǒng)中的組件 |
---|---|---|---|
復(fù)雜的批量數(shù)據(jù)處理 | 小時(shí)級 | MapReduce、Hive | Spark |
基于歷史數(shù)據(jù)的交互式查詢 | 分鐘級、秒級 | Impala、Dremel、Drill | Spark SQL |
基于實(shí)時(shí)數(shù)據(jù)流的數(shù)據(jù)處理 | 毫秒、秒級 | Storm、S4 | Spark Streaming Structured Streaming |
基于歷史數(shù)據(jù)的數(shù)據(jù)挖掘 | —— | Mahout | MLlib |
圖結(jié)構(gòu)數(shù)據(jù)的處理 | —— | Pregel、Hama | GraphX |
三、Spark運(yùn)行架構(gòu)
????????Spark Core包含Spark最基礎(chǔ)和最核心的功能,如內(nèi)存計(jì)算、任務(wù)調(diào)度、部署模式、故障恢復(fù)、存儲(chǔ)管理等,當(dāng)提及Spark運(yùn)行架構(gòu)時(shí),就是指Spark Core的運(yùn)行架構(gòu)。
(一)基本概念
RDD:是Resillient Distributed Dataset(彈性分布式數(shù)據(jù)集)的簡稱,是分布式內(nèi)存的一個(gè)抽象概念,提供了一種高度受限的共享內(nèi)存模型。
DAG:是Directed Acyclic Graph(有向無環(huán)圖)的簡稱,反映RDD之間的依賴關(guān)系。
Executor:是運(yùn)行在工作節(jié)點(diǎn)(WorkerNode)的一個(gè)進(jìn)程,負(fù)責(zé)運(yùn)行Task。
應(yīng)用(Application):用戶編寫的Spark應(yīng)用程序。
任務(wù)( Task ):運(yùn)行在Executor上的工作單元。
作業(yè)( Job ):一個(gè)作業(yè)包含多個(gè)RDD及作用于相應(yīng)RDD上的各種操作。
階段( Stage ):是作業(yè)的基本調(diào)度單位,一個(gè)作業(yè)會(huì)分為多組任務(wù),每組任務(wù)被稱為階段,或者也被稱為任務(wù)集合,代表了一組關(guān)聯(lián)的、相互之間沒有Shuffle依賴關(guān)系的任務(wù)組成的任務(wù)集。
(二)架構(gòu)設(shè)計(jì)
????????Spark運(yùn)行架構(gòu)包括集群資源管理器(Cluster Manager)、運(yùn)行作業(yè)任務(wù)的工作節(jié)點(diǎn)(Worker Node)、每個(gè)應(yīng)用的任務(wù)控制節(jié)點(diǎn)(Driver)和每個(gè)工作節(jié)點(diǎn)上負(fù)責(zé)具體任務(wù)的執(zhí)行進(jìn)程(Executor) 資源管理器可以自帶或Mesos或YARN。

????????一個(gè)應(yīng)用由一個(gè)Driver和若干個(gè)作業(yè)構(gòu)成,一個(gè)作業(yè)由多個(gè)階段構(gòu)成,一個(gè)階段由多個(gè)沒有Shuffle關(guān)系的任務(wù)組成 當(dāng)執(zhí)行一個(gè)應(yīng)用時(shí),Driver會(huì)向集群管理器申請資源,啟動(dòng)Executor,并向Executor發(fā)送應(yīng)用程序代碼和文件,然后在Executor上執(zhí)行任務(wù),運(yùn)行結(jié)束后,執(zhí)行結(jié)果會(huì)返回給Driver,或者寫到HDFS或者其他數(shù)據(jù)庫中。

(三)Spark運(yùn)行基本流程
1、首先為應(yīng)用構(gòu)建起基本的運(yùn)行環(huán)境,即由Driver創(chuàng)建一個(gè)SparkContext,進(jìn)行資源的申請、任務(wù)的分配和監(jiān)控。SparkContext對象代表了和一個(gè)集群的連接。
2、資源管理器為Executor分配資源,并啟動(dòng)Executor進(jìn)程。
3、SparkContext根據(jù)RDD的依賴關(guān)系構(gòu)建DAG圖,DAG圖提交給DAGScheduler解析成Stage,然后把一個(gè)個(gè)TaskSet提交給底層調(diào)度器TaskScheduler處理;Executor向SparkContext申請Task,Task Scheduler將Task發(fā)放給Executor運(yùn)行,并提供應(yīng)用程序代碼。
4、Task在Executor上運(yùn)行,把執(zhí)行結(jié)果反饋給TaskScheduler,然后反饋給DAGScheduler,運(yùn)行完畢后寫入數(shù)據(jù)并釋放所有資源 。

四、Spark編程模型
(一)核心數(shù)據(jù)結(jié)構(gòu)RDD
????????Spark將數(shù)據(jù)抽象成彈性分布式數(shù)據(jù)集(Resilient Distributed Dataset,RDD),RDD實(shí)際是分布在集群多個(gè)節(jié)點(diǎn)上數(shù)據(jù)的集合,通過操作RDD對象來并行化操作集群上的分布式數(shù)據(jù)。
RDD有兩種創(chuàng)建方式:
(1)并行化驅(qū)動(dòng)程序中已有的原生集合;
(2)引用HDFS、HBase等外部存儲(chǔ)系統(tǒng)上的數(shù)據(jù)集。
(二)RDD上的操作
轉(zhuǎn)換(Transformation)操作:將一個(gè)RDD轉(zhuǎn)換為一個(gè)新的RDD。
行動(dòng)(Action)操作:行動(dòng)操作會(huì)觸發(fā)Spark提交作業(yè),對RDD進(jìn)行實(shí)際的計(jì)算,并將最終求得的結(jié)果返回到驅(qū)動(dòng)器程序,或者寫入外部存儲(chǔ)系統(tǒng)中。?
(三)RDD的特性
????????Spark采用RDD以后能夠?qū)崿F(xiàn)高效計(jì)算的原因主要在于:
(1)高效的容錯(cuò)性
????????現(xiàn)有容錯(cuò)機(jī)制:數(shù)據(jù)復(fù)制或者記錄日志
????????RDD:血緣關(guān)系、重新計(jì)算丟失分區(qū)、無需回滾系統(tǒng)、重算過程在不同節(jié)點(diǎn)之間并行、只記錄粗粒度的操作
(2)中間結(jié)果持久化到內(nèi)存,數(shù)據(jù)在內(nèi)存中的多個(gè)RDD操作之間進(jìn)行傳遞,避免了不必要的讀寫磁盤開銷
(3)存放的數(shù)據(jù)可以是Java對象,避免了不必要的對象序列化和反序列化
(四)RDD 的持久化
????????由于Spark RDD是惰性求值的,因此,當(dāng)需要多次使用同一個(gè)轉(zhuǎn)換完的RDD時(shí),Spark會(huì)在每一次調(diào)用行動(dòng)操作時(shí)去重新進(jìn)行RDD的轉(zhuǎn)換操作,這樣頻繁的重算在迭代算法中的開銷很大。 為了避免多次計(jì)算同一個(gè)RDD,可以用persist()或cache()方法來標(biāo)記一個(gè)需要被持久化的RDD,一旦首次被一個(gè)行動(dòng)(Action)觸發(fā)計(jì)算,它將會(huì)被保留在計(jì)算結(jié)點(diǎn)的內(nèi)存中并重用。
(五)RDD之間的依賴關(guān)系?
1、Shuffle操作
2、窄依賴和寬依賴?
????????窄依賴表現(xiàn)為一個(gè)父RDD的分區(qū)對應(yīng)于一個(gè)子RDD的分區(qū)或多個(gè)父RDD的分區(qū)對應(yīng)于一個(gè)子RDD的分區(qū);寬依賴則表現(xiàn)為存在一個(gè)父RDD的一個(gè)分區(qū)對應(yīng)一個(gè)子RDD的多個(gè)分區(qū)。
(六)RDD計(jì)算工作流?
輸入:定義初始RDD,數(shù)據(jù)在Spark程序運(yùn)行時(shí)從外部數(shù)據(jù)空間讀取進(jìn)入系統(tǒng),轉(zhuǎn)換為Spark數(shù)據(jù)塊,形成最初始的RDD;
計(jì)算:形成RDD后,系統(tǒng)根據(jù)定義好的Spark應(yīng)用程序?qū)Τ跏嫉腞DD進(jìn)行相應(yīng)的轉(zhuǎn)換操作形成新的RDD;然后,再通過行動(dòng)操作,觸發(fā)Spark驅(qū)動(dòng)器,提交作業(yè)。如果數(shù)據(jù)需要復(fù)用,可以通過cache操作對數(shù)據(jù)進(jìn)行持久化操作,緩存到內(nèi)存中;
輸出:當(dāng)Spark程序運(yùn)行結(jié)束后,系統(tǒng)會(huì)將最終的數(shù)據(jù)存儲(chǔ)到分布式存儲(chǔ)系統(tǒng)中或Scala數(shù)據(jù)集合中。
文章來源:http://www.zghlxwxcb.cn/news/detail-758072.html
五、Spark的部署方式
Spark支持三種不同類型的部署方式,包括:
Standalone(類似于MapReduce1.0,slot為資源分配單位)
Spark on Mesos(和Spark有血緣關(guān)系,更好支持Mesos)
Spark on YARN文章來源地址http://www.zghlxwxcb.cn/news/detail-758072.html

到了這里,關(guān)于Spark分布式內(nèi)存計(jì)算框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!