spark原理:概念與架構、工作機制

一、HadoopSparkStorm三大框架比較

Hadoop:離線海量數據批處理,基於磁盤的

Spark:基於內存。

Spark特點:運行速度快,使用DAG執行引擎以支持循環數據流與內存計算,

2、容易使用:多種語言編程,通過spark shell進行交互式編程

3、通用性:提供了完整而強大的技術棧,包括sQL查詢、流式計算、機器學習和圖算法組件

4、運行模式多樣:可運行在獨立集羣模式中,可以運行與hadoop中,也可以運行在AmazonEC2等雲環境中,並可以訪問HDFS、HBase、Hive等多種數據源

Scala:多範式編程語言

函數式編程(lisp語言,Haskell語言)

運行於java平臺(jvm,虛擬機),兼容java程序

scala特性:具備強大的併發性,支持函數式編程,支持分佈式系統,

語法簡潔,能提供優雅的API

scala兼容java,運行速度快,能融合到hadoop生態圈中。

scala是spark的主要編程語言,提供REPL(交互式解釋器),提高程序開發效率

SparkHadoop的對比

hadoop的缺點:1、表達能力有限,只能用map和reduce來表示

2、磁盤開銷大

3、延遲高,由於要寫磁盤,因此延遲高

4、任務之間的銜接涉及IO開銷

Spark相對於hadoop MapReduce的優點:

1、不侷限於MapReduce,提供多種數據集操作類型,編程模型比Hadoop MapReduce更靈活

2、spark提供內存計算,可將中間結果放到內存中,對於迭代運算效率更高

3、基於DAG的任務調度機制,效率更高

 

二、Spark生態系統

spark生態系統主要包含了Spark CoreSparkSQLSparkStreamingMLLibGraphX等組件。

1、海量數據批量處理 MapReduce

2、基於歷史數據的交互式查詢 Cloudera Impala

3、實時數據流的處理

spark可以部署在資源管理器Yarn之上,提供一站式大數據解決方案

spark可以同時支持海量數據批量處理、歷史數據分析、實時數據處理

spark生態系統已經成爲伯克利數據分析軟件棧(BDAS)

 

 

Spark生態系統組件的應用場景

三、Spark運行架構

1、基本概念:RDDDAGExecutorApplicationTaskJobStage

RDD:彈性分佈式數據集的簡稱,是分佈式內存的一個抽象概念 ,提供了一個高度共享的內存模型。

和MapReduce相比有兩個優點

1、利用多線程來執行具體任務,減少任務的啓動開銷。

2、同時利用內存和磁盤作爲共同的存儲設備,有限的減少IO開銷。

 

2Spark運行基本原理

1、構建基本的運行環境,由dirver創建一個SparkContext,分配並監控資源使用情況

2、資源管理器爲其分配資源,啓動Excutor進程

3、SparkContext根據RDD 的依賴關係構建DAG圖,GAG圖提交給DAGScheduler解析成stage,然後提交給底層的taskscheduler處理。

executor向SparkContext申請task,taskscheduler 將task發放給Executor運行並提供應用程序代碼

4、Task在Executor運行把結果反饋給TaskScheduler,一層層反饋上去。最後釋放資源

運行架構特點:多線程運行、運行過程與資源管理器無關、Task採用了數據本地性和推測執行來優化。

3RDD概念

設計背景,迭代式算法,若採用MapReduce則會重用中間結果;MapReduce不斷在磁盤中讀寫數據,會帶來很大開銷。

RDD的典型執行過程

1)讀入外部數據源進行創建,分區

2)RDD經過一系列的轉化操作,每一次都會產生不同的RDD供給下一個轉化擦操作使用

3)最後一個RDD經過一個動作操作進行計算並輸出到外部數據源

優點:惰性調用、調用、管道化、避免同步等待,不需要保存中間結果     

高效的原因:

1)容錯性:現有方式是用日誌記錄的方式。而RDD具有天生的容錯,任何一個RDD出錯,都可以去找父親節點,代價低。RDD的每次轉換都會生成一個新的RDD,所以RDD之間就會形成類似於流水線一樣的前後依賴關係。在部分分區數據丟失時,Spark可以通過這個依賴關係重新計算丟失的分區數據,而不是對RDD的所有分區進行重新計算。

2)中間結果保存到內存,避免了不必要的內存開銷

3)存放的數據可以是java對象,避免了對象的序列化和反序列化。

 

RDD的依賴關係:窄依賴和寬依賴

窄依賴:(narrow dependency)是指每個父RDD的一個Partition最多被子RDD的一個Partition所使用,例如map、filter、union等操作都會產生窄依賴;(獨生子女)即rdd中的每個partition僅僅對應父rdd中的一個partition。rdd裏面的partition只去向子rdd裏的某一個partition!這叫窄依賴,如果父rdd裏面的某個partition會去子rdd裏面的多個partition,那它就一定是寬依賴!

寬依賴(shuffle dependency):是指一個父RDD的Partition會被多個子RDD的Partition所使用,例如groupByKey、reduceByKey、sortByKey等操作都會產生寬依賴;(超生)每一個父rdd的partition數據都有可能傳輸一部分數據到子rdd的每一個partition中,即子rdd的多個partition依賴於父rdd。寬依賴劃分成一個stage!!!

作用:完成Stage的劃分

spark劃分stage的整體思路是:從後往前推,遇到寬依賴就斷開,劃分爲一個stage;遇到窄依賴就將這個RDD加入該stage中。因此在上圖中RDD C,RDD D,RDD E,RDDF被構建在一個stage中,RDD A被構建在一個單獨的Stage中,而RDD B和RDD G又被構建在同一個stage中。

Stage的劃分:

ShuffleMapStage和ResultStage:

簡單來說,DAG的最後一個階段會爲每個結果的partition生成一個ResultTask,即每個Stage裏面的Task的數量是由該Stage中最後一個RDD的Partition的數量所決定的!而其餘所有階段都會生成ShuffleMapTask;之所以稱之爲ShuffleMapTask是因爲它需要將自己的計算結果通過shuffle到下一個stage中;也就是說上圖中的stage1和stage2相當於mapreduce中的Mapper,而ResultTask所代表的stage3就相當於mapreduce中的reducer。

四、Spark SQL

Spark的另外一個組件。先說一下shark(Hive on Spark),爲了實現與Hive兼容,在HiveQL方面重用了HIveQL的解析、邏輯執行計劃翻譯等邏輯,把HiveQL操作翻譯成Spark上的RDD操作。相當於在最後將邏輯計劃轉換爲物理計劃時將原來轉換成MapReduce替換成了轉換成Spark

 

與spark相比,sparkSQL不再是依賴於Hive,而是形成了一套自己的SQL,只依賴了Hive解析、Hive元數據。從hql被解析成語法抽象樹之後,剩下的東西全部是自己的東西,不再依賴Hive原來的組件,增加了SchemaRDD,運行在SchemaRDD中封裝更多的數據,數據分析功能更強大。同時支持更多語言,除R語言外,還支持Scala、Java、python語言。

 

五、Spark安裝和部署

1Standalone 2、Spark on mesos 3、spark on yarn

企業中的應用部署

六、spark編程

編寫應用程序

1、加載文件到RDD中

2、設置環境變量

3、創建SparkContext

4、轉換操作

5、Action計算操作1

6、創建sbt文件

7、使用sbt對其進行打包

8、把jar包提交到spark中運行。

 

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