1、Hadoop、Spark、Storm三大框架比較java
Hadoop:離線海量數據批處理,基於磁盤的python
Spark:基於內存。算法
Spark特色:運行速度快,使用DAG執行引擎以支持循環數據流與內存計算,shell
二、容易使用:多種語言編程,經過spark shell進行交互式編程編程
三、通用性:提供了完整而強大的技術棧,包括sQL查詢、流式計算、機器學習和圖算法組件多線程
四、運行模式多樣:可運行在獨立集羣模式中,能夠運行與hadoop中,也能夠運行在AmazonEC2等雲環境中,並能夠訪問HDFS、HBase、Hive等多種數據源架構
Scala:多範式編程語言併發
函數式編程(lisp語言,Haskell語言)app
運行於java平臺(jvm,虛擬機),兼容java程序框架
scala特性:具有強大的併發性,支持函數式編程,支持分佈式系統,
語法簡潔,能提供優雅的API
scala兼容java,運行速度快,能融合到hadoop生態圈中。
scala是spark的主要編程語言,提供REPL(交互式解釋器),提升程序開發效率
Spark與Hadoop的對比
hadoop的缺點:一、表達能力有限,只能用map和reduce來表示
二、磁盤開銷大
三、延遲高,因爲要寫磁盤,所以延遲高
四、任務之間的銜接涉及IO開銷
Spark相對於hadoop MapReduce的優勢:
一、不侷限於MapReduce,提供多種數據集操做類型,編程模型比Hadoop MapReduce更靈活
二、spark提供內存計算,可將中間結果放到內存中,對於迭代運算效率更高
三、基於DAG的任務調度機制,效率更高
2、Spark生態系統
spark生態系統主要包含了Spark Core、SparkSQL、SparkStreaming、MLLib和GraphX等組件。
一、海量數據批量處理 MapReduce
二、基於歷史數據的交互式查詢 Cloudera Impala
三、實時數據流的處理
spark能夠部署在資源管理器Yarn之上,提供一站式大數據解決方案
spark能夠同時支持海量數據批量處理、歷史數據分析、實時數據處理
spark生態系統已經成爲伯克利數據分析軟件棧(BDAS)
Spark生態系統組件的應用場景
3、Spark運行架構
1、基本概念:RDD、DAG、Executor、Application、Task、Job、Stage
RDD:彈性分佈式數據集的簡稱,是分佈式內存的一個抽象概念 ,提供了一個高度共享的內存模型。
和MapReduce相比有兩個優勢
一、利用多線程來執行具體任務,減小任務的啓動開銷。
二、同時利用內存和磁盤做爲共同的存儲設備,有限的減小IO開銷。
2、Spark運行基本原理
一、構建基本的運行環境,由dirver建立一個SparkContext,分配並監控資源使用狀況
二、資源管理器爲其分配資源,啓動Excutor進程
三、SparkContext根據RDD 的依賴關係構建DAG圖,GAG圖提交給DAGScheduler解析成stage,而後提交給底層的taskscheduler處理。
executor向SparkContext申請task,taskscheduler 將task發放給Executor運行並提供應用程序代碼
四、Task在Executor運行把結果反饋給TaskScheduler,一層層反饋上去。最後釋放資源
運行架構特色:多線程運行、運行過程與資源管理器無關、Task採用了數據本地性和推測執行來優化。
3、RDD概念
設計背景,迭代式算法,若採用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。
4、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語言。
5、Spark安裝和部署
1Standalone 二、Spark on mesos 三、spark on yarn
企業中的應用部署
6、spark編程
編寫應用程序
一、加載文件到RDD中
二、設置環境變量
三、建立SparkContext
四、轉換操做
五、Action計算操做1
六、建立sbt文件
七、使用sbt對其進行打包
八、把jar包提交到spark中運行。