?運行架構:
? ? ? ? ?Spark采用master - slave結構,Driver作為master負責作業任務調度,Executor作為slave負責實際執行任務。
核心組件
- ?Driver:執行Spark任務的main方法,將用戶程序轉化為作業,在Executor間調度任務,跟蹤Executor執行情況并通過UI展示運行情況。
- -Executor:工作節點中的JVM進程,運行任務并返回結果,還為緩存的RDD提供內存式存儲。
- Master & Worker:在獨立部署環境中,Master負責資源調度分配和集群監控,Worker在Master分配資源后進行數據并行處理。
- -ApplicationMaster:在YARN環境中,負責申請資源容器、運行任務、監控任務狀態和處理異常。
核心概念
- Executor與Core:Executor是計算節點,可通過參數指定其數量、內存大小和虛擬CPU核數量。
- 并行度:指集群并行執行任務的數量,默認由框架配置,也可在應用運行時動態修改。
- 有向無環圖(DAG):是Spark程序數據流的高級抽象模型,用圖形表示程序計算執行過程,用于展示程序拓撲結構。
提交流程
? ? ? 以Yarn環境為例,Spark應用程序有Client和Cluster兩種部署執行方式。
- Yarn Client模式:Driver在本地機器運行,與ResourceManager通訊申請啟動ApplicationMaster,后續完成Executor啟動、反向注冊等流程后執行main函數,遇到Action算子時劃分stage并分發task。
- Yarn Cluster模式:Driver在Yarn集群資源中執行,任務提交后申請啟動ApplicationMaster(此時ApplicationMaster就是Driver),后續流程與Client模式類似 。
RDD相關概念
RDD概述:
? ? ? RDD是Spark最基本的數據處理模型,是一個抽象類,代表彈性、不可變、可分區且元素可并行計算的集合。具有存儲、容錯、計算、分片彈性,數據分布式存儲,封裝計算邏輯但不保存數據。
核心屬性:
? ? ? 包含分區列表、分區計算函數、RDD之間的依賴關系、分區器(K-V類型數據時可選)、首選位置(可選),這些屬性是RDD實現分布式計算和高效處理的關鍵。
執行原理:
? ? ? ?在Yarn環境中,Spark先申請資源創建調度和計算節點,將計算邏輯按分區劃分為任務,調度節點根據計算節點狀態發送任務執行,RDD負責封裝邏輯并生成任務。
RDD序列化:
? ? ? ?涉及閉包檢查,確保算子外數據可序列化;Spark支持Kryo序列化框架,比Java序列化速度快10倍,使用時即使采用Kryo序列化,相關類也需繼承Serializable接口。
RDD依賴關系
血緣關系:
? ? ?記錄RDD元數據和轉換行為,用于恢復丟失分區數據。
依賴類型:
? ? ?窄依賴指父RDD分區最多被一個子RDD分區使用;
? ? ?寬依賴指父RDD分區被多個子RDD分區依賴,會引發Shuffle。
階段與任務劃分:
? ? ? DAG記錄RDD轉換和任務階段;一個Action算子生成一個Job,Stage數量為寬依賴個數加1,一個Stage中最后一個RDD的分區數就是Task個數。
RDD持久化
Cache緩存:
? ? ?通過Cache或Persist方法緩存計算結果,默認存于JVM堆內存,觸發action算子時緩存,緩存丟失可重算丟失部分。
CheckPoint檢查點:
? ? ?將RDD中間結果寫入磁盤,切斷血緣依賴,提升容錯性,執行Action操作才會觸發。
區別:
? ? ? Cache不切斷血緣,數據可靠性低;Checkpoint切斷血緣,數據存儲在高可靠文件系統。建議對Checkpoint的RDD使用Cache緩存以提升效率。
RDD分區器:
? ? ? Spark支持Hash分區(默認)、Range分區和用戶自定義分區,僅Key - Value類型RDD有分區器。
? ? ? ?Hash分區根據key的hashCode取余確定分區;Range分區將數據按范圍映射到分區,保證數據均勻且分區間有序。
RDD文件讀取與保存:
? ? ? ? 可從文件格式(text、csv、sequence、object文件)和文件系統(本地、HDFS、HBASE、數據庫)兩個維度區分。不同文件格式有相應讀取和保存方法,如text文件用?sc.textFile?讀取、?saveAsTextFile?保存。
?