🍋🍋大數據學習🍋🍋
🔥系列專欄: 👑哲學語錄: 用力所能及,改變世界。
💖如果覺得博主的文章還不錯的話,請點贊👍+收藏??+留言📝支持一下博主哦🤞
一、Spark概述
(1)概述
????????Spark,是一種"One Stack to rule them all"的大數據計算框架,期望使用一個技術堆棧就完美地解決大數據領域的各種計算任務。Apache官方,對Spark的定義就是:通用的大數據快速處理引擎。
????????Spark使用Spark RDD、Spark SQL、 Spark Streaming,MLlib,GraphX成功解決了大數據領城中,離線批處理、交互式查詢、實時流計算、機器學習與圖計算等最重要的任務和問題。
Spark除了一站式的特點之外,另外一個最重要的特點,就是基于內存進行計算,從而讓它的速度可以達到MapReduce、Hive的數倍甚至數十倍!
????????現在已經有很多大公司正在生產環境下深度地使用Spark作為大數據的計算框架,包括eBay.Yahool、 BAT、網易、京東、華為、大眾點評、優酷土豆、搜狗等等。Spark同時也獲得了多個世界頂級IT廠商的支持,包括IBM、 Intel等。
????????Spark,是一種通用的大數據計算框架,也正如傳統大數據技術Hadoop的MapReduce、Hive引擎,以及Storm流式實時計算引擎等,
????????Spark包含了大數據領城常見的各種計算框架:比如Spark Core用于離線計算,Spark SQL用于交互式查詢,Spark Streaming用于實時流式計算,Spark MILlib用于機器學習,Spark GraphX用于圖計算。
????????Spark主要用于大數據的計算,而Hadoop以后主要用于大數據的存儲(比如HDFS、Hive,HBase等),以及資源調度(Yarn)。Spark+Hadoop的組合,是未來大數據領域最熱門的組合,也是最有前景的組合!
(2)Spark整體架構
(3)Spark特性
(1)spark 計算速度快
spark將每個任務構建成DAG進行計算,內部的計算過程通過彈性式分布式數據集RDD在內存在進行計算,相比于hadoop的mapreduce效率提升了100倍。
(2)易于使用
spark 提供了大量的算子,開發只需調用相關api進行實現無法關注底層的實現原理。
通用的大數據解決方案
相較于以前離線任務采用mapreduce實現,實時任務采用storm實現,目前這些都可以通過spark來實現,降低來開發的成本。同時spark 通過spark SQL降低了用戶的學習使用門檻,還提供了機器學習,圖計算引擎等。
(3)支持多種的資源管理模式
學習使用中可以采用local 模型進行任務的調試,在正式環境中又提供了standalone,yarn等模式,方便用戶選擇合適的資源管理模式進行適配。
(4)社區支持
spark 生態圈豐富,迭代更新快,成為大數據領域必備的計算引擎。
(4)Spark與MR
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來的完善。實現起來非常麻煩。
(5)Spark Streaming與Storm
????????Spark Streaming 與Storm都可以用于進行實時流計算。但是他們兩者的區別是非常大的。其中區別之一,就是,Spark。
????????Streaming 和Storm的計算模型完全不一樣,Spark Streaming是基于RDD的,因此需要將一小段時間內的,比如1秒內的數據,收集起來,作為一個RDD,然后再針對這個batch的數據進行處理。而Storm卻可以做到每來一條數據,都可以立即進行處理和計算。因此,Spark Streaming實際上嚴格意義上來說,只能稱作準實時的流計算框架;西Storm是真正意義上的實時計算框架。此外,Storm支持的一項高級特性,是Spark Streaming暫時不具備的,即Storm支持在分布式流式計算程序(Topolopy)在運行過程中,可以動態地調整并行度,從而動態提高并發處理能力。而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是更好的選擇。
(6)Spark SQL與Hive
????????Spark SQL實際上并不能完全替代Hive,因為Hive是一種基于HDFS的數據倉庫,并且提供了基于SQL模型的,針對存儲了大數據的數據倉庫,進行分布式交互查詢的查詢引擎。
????????嚴格的來說, Spark SQL能夠替代的,是Hive的查詢引擎,而不是Hive本身,實際上即使在生產環境下, SparkSQL也是針對Hive數據倉庫中的數據進行查詢, Spark本身自己是不提供存儲的,自然也不可能替代Hive作為數據倉庫的這個功能。
????????Spark SQL的一個優點,相較于Hive查詢引擎來說,就是速度快,同樣的SQL語句,可能使用Hive的查詢引擎,由于其底層基于 MapReduce,必須經過 shuffle過程走磁盤,因此速度是非常緩慢的。很多復雜的SQL語句,在hive中執行都需要一個小時以上的時間。而 Spark SQLSpark由于其底層基于自身的基于內存的特點,因此速度達到了Hive查詢引擎的數倍以上。
????????SQLSpark由于身處技術堆棧內,也是基于RDD來工作,因此可以與 Spark的其他組件無縫整合使用,配合起來實現許多復雜的功能。比如 Spark SQL支持可以直接針對hdfs文件執行sq語句。
二、Spark基本原理
(1)Spark Core
Spark Core是Spark的核心,其包含如下幾個部分:
(1)spark 基礎配置
sparkContext是spark應用程序的入口,spark應用程序的提交和執行離不開sparkContext,它隱藏了網絡通信,分布式部署,消息通信,存儲體系,計算存儲等,開發人員只需要通過sparkContext等api進行開發即可。
sparkRpc 基于netty實現,分為異步和同步兩種方式。事件總線主要用于sparkContext組件間的交換,它屬于監聽者模式,采用異步調用。度量系統主要用于系統的運行監控。
(2)spark 存儲系統
它用于管理spark運行中依賴的數據存儲方式和存儲位置,spark的存儲系統優先考慮在各節點以內存的方式存儲數據,內存不足時將數據寫入磁盤中,這也是spark計算性能高的重要原因。
我們可以靈活的控制數據存儲在內存還是磁盤中,同時可以通過遠程網絡調用將結果輸出到遠程存儲中,比如hdfs,hbase等。
(3)spark 調度系統
spark 調度系統主要由DAGScheduler和TaskScheduler組成。
DAGScheduler 主要是把一個Job根據RDD間的依賴關系,劃分為多個Stage,對于劃分后的每個Stage都抽象為一個或多個Task組成的任務集,并交給TaskScheduler來進行進一步的任務調度。而TaskScheduler 負責對每個具體的Task進行調度。
具體調度算法有FIFO,FAIR:
FIFO調度:先進先出,這是Spark默認的調度模式。
FAIR調度:支持將作業分組到池中,并為每個池設置不同的調度權重,任務可以按照權重來決定執行順序。
(2)Spark SQL
spark sql提供了基于sql的數據處理方法,使得分布式的數據集處理變的更加簡單,這也是spark 廣泛使用的重要原因。
目前大數據相關計算引擎一個重要的評價指標就是:是否支持sql,這樣才會降低使用者的門檻。spark sql提供了兩種抽象的數據集合DataFrame和DataSet。
DataFrame 是spark Sql 對結構化數據的抽象,可以簡單的理解為spark中的表,相比較于RDD多了數據的表結構信息(schema).DataFrame = Data + schema
RDD是分布式對象集合,DataFrame是分布式Row的集合,提供了比RDD更豐富的算子,同時提升了數據的執行效率。
DataSet 是數據的分布式集合 ,它具有RDD強類型的優點 和Spark SQL優化后執行的優點。DataSet可以由jvm對象構建,然后使用map,filter,flatmap等操作函數操作。
關于Spark SQL可以看這篇文章:
https://blog.csdn.net/weixin_45366499/article/details/108749586
(3)Spark Streaming
這個模塊主要是對流數據的處理,支持流數據的可伸縮和容錯處理,可以與Flume和Kafka等已建立的數據源集成。Spark Streaming的實現,也使用RDD抽象的概念,使得在為流數據編寫應用程序時更為方便。
關于Spark Streaming可以看這篇文章:
https://blog.csdn.net/weixin_45366499/article/details/108816335
(4)Spark基本工作原理
????????Spark基本工作原理的理解,其最主要的是要搞清楚什么是RDD以及RDD的特性。深刻理解了RDD的特性,也就理解了數據在spark中是如何被處理的(spark的基本工作原理)
那么RDD是什么,官方說法:
????????RDD是Spark提供的核心抽象,全稱為Resillient Distributed Dataset,即彈性分布式數據集。
最簡單的理解:
????????RDD就是源數據的抽象,或者叫映射,或者就代表。也就是說,數據要被spark進行處理,在處理之前的首要任務就是要將數據映射成RDD,對于spark來說,RDD才是我們處理數據的規則,我只認RDD,只有RDD,通過我spark的計算引擎,才能發揮巨大的威力!
(1)分布式數據集
????????RDD是Spark提供的核心抽象,全稱為Resillient Distributed Dataset,即彈性分布式數據集。
????????RDD在抽象上來說是一種元素集合,包含了數據。它是被分區的,分為多個分區,每個分區分布在集群中的不同節點上,從而讓RDD中的數據可以被并行操作。
(2)彈性
????????RDD的數據默認情況下存放在內存中的,但是在內存資源不足時,Spark會自動將RDD數據寫入磁盤。
(3)迭代式處理
????????對節點1、2、3、4上的數據進行處理完成之后,可能會移動到其他的節點內存中繼續處理!Spark 與Mr最大的不同在與迭代式計算模型:Mr分為兩個階段,map和reduce,兩個階段處理完了就結束了,所以我們在一個job中能做的處理很有限,只能在map和reduce中處理;而spark計算過程可以分為n個階段,因為他是內存迭代式的,我們在處理完一個階段之后,可以繼續往下處理很多階段,而不是兩個階段。所以Spark相較于MR,計算模型可以提供更強大的功能。
(4)容錯性
????????RDD最重要的特性就是,提供了容錯性,可以自動從節點失敗中恢復過來。即如果某個節點上的RDD partition,因為節點故障,導致數據丟了,那么RDD會自動通過自己的數據來源重新計算該partition。這一切對使用者是透明的。
三、Spark作業運行流程
(1)Spark作業運行流程
? ? ? ? spark應用程序以進程集合為單位在分布式集群上運行,通過driver程序的main方法創建sparkContext的對象與集群進行交互。具體運行流程如下:
- sparkContext向cluster Manager申請CPU,內存等計算資源。
- cluster Manager分配應用程序執行所需要的資源,在worker節點創建executor。
- sparkContext將程序代碼和task任務發送到executor上進行執行,代碼可以是編譯成的jar包或者python文件等。接著sparkContext會收集結果到Driver端。
(2) Spark RDD迭代過程
????????sparkContext創建RDD對象,計算RDD間的依賴關系,并組成一個DAG有向無環圖。
????????DAGScheduler將DAG劃分為多個stage,并將stage對應的TaskSet提交到集群的管理中心,stage的劃分依據是RDD中的寬窄依賴,spark遇見寬依賴就會劃分為一個stage,每個stage中包含來一個或多個task任務,避免多個stage之間消息傳遞產生的系統開銷。
????????taskScheduler 通過集群管理中心為每一個task申請資源并將task提交到worker的節點上進行執行。
????????worker上的executor執行具體的任務。
(3)Yarn資源管理器介紹
????????spark 程序一般是運行在集群上的,spark on yarn是工作或生產上用的非常多的一種運行模式。
????????沒有yarn模式前,每個分布式框架都要跑在一個集群上面,比如說Hadoop要跑在一個集群上,Spark用集群的時候跑在standalone上。這樣的話整個集群的資源的利用率低,且管理起來比較麻煩。
????????yarn是分布式資源管理和任務管理管理,主要由ResourceManager,NodeManager和ApplicationMaster三個模塊組成。
????????ResourceManager 主要負責集群的資源管理,監控和分配。對于所有的應用它有絕對的控制權和資源管理權限。
????????NodeManager 負責節點的維護,執行和監控task運行狀況。會通過心跳的方式向ResourceManager匯報自己的資源使用情況。
????????yarn資源管理器的每個節點都運行著一個NodeManager,是ResourceManager的代理。如果主節點的ResourceManager宕機后,會連接ResourceManager的備用節點。
????????ApplicationMaster 負責具體應用程序的調度和資源的協調,它會與ResourceManager協商進行資源申請。ResourceManager以container容器的形式將資源分配給application進行運行。同時負責任務的啟停。
????????container 是資源的抽象,它封裝著每個節點上的資源信息(cpu,內存,磁盤,網絡等),yarn將任務分配到container上運行,同時該任務只能使用container描述的資源,達到各個任務間資源的隔離。
(4)Spark程序在Yarn上執行流程
????????spark on yarn分為兩種模式yarn-client模式,和yarn—cluster模式,一般線上采用的是yarn-cluster模式。
(1)yarn-client模式
????????driver在客戶端本地執行,這種模式可以使得spark application和客戶端進行交互,因為driver在客戶端可以通過webUI訪問driver的狀態。同時Driver會與yarn集群中的Executor進行大量的通信,會造成客戶機網卡流量的大量增加。
(2)yarn-cluster模式
????????Yarn-Cluster主要用于生產環境中,因為Driver運行在Yarn集群中某一臺NodeManager中,每次提交任務的Driver所在的機器都是隨機的,不會產生某一臺機器網卡流量激增的現象,缺點是任務提交后不能看到日志。只能通過yarn查看日志。
下圖是yarn-cluster運行模式:
- client 向yarn提交應用程序,包含ApplicationMaster程序、啟動ApplicationMaster的命令、需要在Executor中運行的程序等。
- ApplicationMaster程序啟動ApplicationMaster的命令、需要在Executor中運行的程序等。
- ApplicationMaster向ResourceManager注冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態。
- ApplicationMaster申請到資源(也就是Container)后,便與對應的NodeManager通信,啟動Task。
- Task向ApplicationMaster匯報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。
- 應用程序運行完成后,ApplicationMaster向ResourceManager申請注銷并關閉自己。