大數據學習(92)-spark詳解

🍋🍋大數據學習🍋🍋

🔥系列專欄: 👑哲學語錄: 用力所能及,改變世界。
💖如果覺得博主的文章還不錯的話,請點贊👍+收藏??+留言📝支持一下博主哦🤞


一、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運行模式:

  1. client 向yarn提交應用程序,包含ApplicationMaster程序、啟動ApplicationMaster的命令、需要在Executor中運行的程序等。
  2. ApplicationMaster程序啟動ApplicationMaster的命令、需要在Executor中運行的程序等。
  3. ApplicationMaster向ResourceManager注冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態。
  4. ApplicationMaster申請到資源(也就是Container)后,便與對應的NodeManager通信,啟動Task。
  5. Task向ApplicationMaster匯報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務。
  6. 應用程序運行完成后,ApplicationMaster向ResourceManager申請注銷并關閉自己。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/899517.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899517.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899517.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RAG - 五大文檔切分策略深度解析

文章目錄 切分策略1. 固定大小分割(Fixed-Size Chunking)2. 滑動窗口分割(Sliding Window Chunking)3. 自然語言單元分割(Sentence/Paragraph Segmentation)4. 語義感知分割(Semantic-Aware Seg…

微信小程序引入TDesign組件后報錯一直提示路徑不對(Component is not found in path)的解決方法

最近在做微信小程序的項目,創建好項目后,按官方方式引入TDesign組件,但還是一直提示報錯(Component is not found in path "miniprogram_npm/tdesign-miniprogram/button/button" (using by "pages/login/login&qu…

攔截器和過濾器詳解

在 Java Web 開發中,攔截器(Interceptor)和過濾器(Filter)是兩種常見的請求處理機制,它們用于對請求和響應進行預處理和后處理 1. 過濾器(Filter) 1.1 作用 Filter 主要用于對 請求…

【機械視覺】C#+VisionPro聯合編程———【六、visionPro連接工業相機設備】

【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 目錄 【機械視覺】C#VisionPro聯合編程———【六、visionPro連接工業相機設備】 前言: 連接步驟說明 一. 硬件連接 支持的相機接口類型: 連接步驟 2. 軟件配置 Visio…

筆記:基于環境語義的通感融合技術,將傳統通信由“被動接收”轉為“主動感知”

《基于計算機視覺的感知通信融合理論與關鍵技術研發進展》 介紹了聯合研發的基于環境語義的通感融合技術研發進展。 觀點:利用環境感知信息或環境語義輔助通信的通感融合技術成為6G重要方向之一 產出:基于環境感知的毫米波波束管理方案,并…

Kafka 多線程開發消費者實例

目前,計算機的硬件條件已經大大改善,即使是在普通的筆記本電腦上,多核都已經是標配了,更不用說專業的服務器了。如果跑在強勁服務器機器上的應用程序依然是單線程架構,那實在是有點暴殄天物了。不過,Kafka …

zynq7000 + ucos3 + lwip202_v1_2調試過程

1 現在裸機應用上驗證lwip 跑起來可能會報錯,看下面的鏈接解決 zynq 網卡Phy setup error問題 zynq 網卡Phy setup error問題-CSDN博客 2 ping同以后,在zynq上添加ucos系統 鏈接如下: ZYNQ移植uCOSIII_zynq ucos-CSDN博客 3 移植lwip協議…

Android7 Input(二)Linux 驅動層輸入事件管理

概述 在Linux系統中,將鍵盤,鼠標,觸摸屏等這類交互設備交由Linux Input子系統進行管理,Linux Input驅動子系統由于具有良好的和用戶空間交互的接口。因此Linux Input驅動子系統,不止于只管理輸入類型的設備。也可以將其…

Java內存中的Heap(堆)的作用

Java內存中的Heap(堆)的作用 在 Java 的內存模型中,Heap(堆) 是 JVM(Java Virtual Machine)管理的運行時數據區域之一,主要用于存儲程序運行過程中動態分配的對象和數據。它是 Java…

自行車模型與汽車模型的混合策略在自動駕駛中的多維度協同優化

基于動態架構與智能調度的自動駕駛系統設計 #mermaid-svg-1yvF1EzG07ktndY6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1yvF1EzG07ktndY6 .error-icon{fill:#552222;}#mermaid-svg-1yvF1EzG07ktndY6 .error-tex…

mysql.8.4.4--初始化報錯--libnuma.so.1缺失

錯誤 mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory解決辦法:下載相關依賴 sudo apt update sudo apt install numactl然后重新初始化 mysqld --initialize

【區塊鏈安全 | 第三篇】主流公鏈以太坊運行機制

文章目錄 1. 以太坊賬戶類型2. 以太坊網絡架構2.1 節點類型2.2 交易流程 3. 共識機制4. Gas 機制4.1 Gas 計算方式4.2 以太坊 EIP-1559 交易機制 5. EVM(以太坊虛擬機)5.1 EVM 結構5.2 EVM 指令5.3 EVM 運行機制 6. 智能合約7. ERC 代幣標準7.1 ERC-207.…

計算機三級信息安全部分英文縮寫

eip,指令寄存器,用于存放指向下一條將執行指令的指針,即返回地址棧頂指針esp基址指針寄存器EBP,基地址數據執行保護DEP(Data Execute Prevention)技術可以設置內存堆棧區的代碼為不可執行狀態,從而防范溢出后代碼的執行…

【Goalng】第九彈-----文件操作、JSON處理

🎁個人主頁:星云愛編程 🔍所屬專欄:【Go】 🎉歡迎大家點贊👍評論📝收藏?文章 長風破浪會有時,直掛云帆濟滄海 目錄 1.文件操作 1.1文件介紹 1.2.文件流 1.3.打開和關閉文件 1…

C#高級:啟動、中止一個指定路徑的exe程序

一、啟動一個exe class Program {static void Main(string[] args){string exePath "D:\測試\Test.exe";// 修改為你要運行的exe路徑StartProcess(exePath);}private static bool StartProcess(string exePath){// 創建一個 ProcessStartInfo 對象來配置進程啟動參…

猜猜我用的是哪個大模型?我的世界游戲界面簡單的模擬效果

我的羅里吧嗦的,根據小朋友的要求,邊聽邊寫邊輸入的提示詞: 請生成一段完整的在網頁中用html5和javascript代碼模擬“我的世界”中游戲場景的互動畫面,要求提供若干人物選項可以選擇,請自行選擇需要使用哪些庫或框架來…

AI知識補全(八):多模態大模型是什么?

名人說:人生如逆旅,我亦是行人。 ——蘇軾《臨江仙送錢穆父》 創作者:Code_流蘇(CSDN)(一個喜歡古詩詞和編程的Coder😊) 上一篇:AI知識補全(七):AI Agent 智能…

更新docker 容器時,提前換后端jar 包,為什么會存在異常

我們現場更新時,通常都是提前將后端jar 包替換了,然后到了更新的時間,只需要更新相關的前端文件和修改各種配置,就行了。 但是最近一次更新操作中,忽然發現,提前更新后端包,會存在依賴丟失問題…

LoRA 模型微調框架核心原理及實現步驟

LoRA(Low-Rank Adaptation)模型微調框架通過低秩矩陣分解原理,實現了對大型預訓練模型的高效微調。其核心原理是:在凍結預訓練模型權重的基礎上,向特定層注入可訓練的低秩矩陣,以極少量參數(通常…

XHR.readyState詳解

XHR.readyState詳解 引言 XHR.readyState是XMLHttpRequest對象的一個屬性,它反映了當前請求的狀態。在Ajax編程中,正確理解和使用XHR.readyState對于調試和確保異步請求的正確執行至關重要。本文將詳細介紹XHR.readyState的屬性值、含義以及在Ajax請求中的具體應用。 XHR.…