?博客主頁: https://blog.csdn.net/m0_63815035?type=blog
💗《博客內容》:大數據、Java、測試開發、Python、Android、Go、Node、Android前端小程序等相關領域知識
📢博客專欄: https://blog.csdn.net/m0_63815035/category_11954877.html
📢歡迎點贊 👍 收藏 ?留言 📝
📢本文為學習筆記資料,如有侵權,請聯系我刪除,疏漏之處還請指正🙉
📢大廈之成,非一木之材也;大海之闊,非一流之歸也?
前言
一、概述
-
簡介
- Apache Spark 是快速通用的分布式計算引擎,誕生于加州大學伯克利分校AMP實驗室,基于內存計算,適用于迭代算法(如數據挖掘、機器學習)。
- 核心優勢:中間結果緩存于內存,減少磁盤IO,比Hadoop MapReduce快10-100倍。
-
歷史
- 2009年始于伯克利大學,2010年開源,2014年成為Apache頂級項目。
- 主要創始人Matei Zaharia創立了Databricks公司,推動Spark商業化。
-
與MapReduce對比
特性 MapReduce Spark 編程模型 僅Map和Reduce 支持多種算子(map、flatMap等) 運算效率 中間結果寫入磁盤,IO開銷大 中間結果存內存,基于DAG優化調度 適用場景 離線計算 離線+實時計算 數據共享 依賴HDFS讀寫 內存緩存復用 -
核心特點
- 快:內存計算+DAG引擎,速度遠超MapReduce。
- 易用:支持Scala、Java、Python等多語言,提供80+高級算法。
- 通用:一站式支持批處理(Spark Core)、交互式查詢(Spark SQL)、流處理(Spark Streaming)、機器學習(MLlib)、圖計算(GraphX)。
- 兼容:可整合Hadoop生態(HDFS、YARN等)。
二、核心組件
-
Spark Core
- 核心組件,負責離線批處理,提供RDD(彈性分布式數據集)抽象。
-
其他組件
- Spark SQL:結構化數據查詢,支持SQL和DataFrame。
- Spark Streaming:準實時流處理,基于DStream。
- MLlib:機器學習庫,包含分類、回歸等算法。
- GraphX:圖計算庫,支持圖算法(如PageRank)。
三、運行架構
-
核心角色
- Driver:負責任務調度、DAG生成、與集群通信。
- Executor:運行Task,緩存數據,位于Worker節點。
- Cluster Manager:資源管理器(支持Standalone、YARN、K8s等)。
-
運行流程
- 提交應用→Driver申請資源→Executor反向注冊→解析代碼生成RDD→DAG調度劃分Stage→Task分發至Executor執行。
-
運行模式
- Local:本地模式,用于調試,單進程多線程模擬集群。
- Standalone:Spark自帶集群模式,Master-Worker架構。
- YARN:整合Hadoop YARN,國內主流模式,支持Client/Cluster部署。
- Kubernetes:容器化部署,支持動態資源調度。
四、核心編程
-
RDD(彈性分布式數據集)
- 定義:不可變、可分區、并行計算的分布式數據集合,通過血統(Lineage)實現容錯。
- 五大屬性:分區列表、分區計算函數、依賴關系、分區器(可選)、首選計算位置(可選)。
- 創建方式:
- 內存集合(
parallelize
/makeRDD
) - 外部文件(
textFile
/wholeTextFiles
)
- 內存集合(
-
算子
- 轉換算子(Transformation):懶執行,返回新RDD(如
map
、filter
、reduceByKey
)。 - 行動算子(Action):觸發計算,返回結果(如
collect
、count
、foreach
)。 - 控制算子:
cache
(內存緩存)、persist
(磁盤緩存)、checkpoint
(持久化并切斷依賴)。
- 轉換算子(Transformation):懶執行,返回新RDD(如
-
寬依賴與窄依賴
- 窄依賴:父RDD分區與子RDD分區一對一(如
map
),可并行計算。 - 寬依賴:父RDD分區與子RDD分區多對多(如
groupByKey
),會產生Shuffle。
- 窄依賴:父RDD分區與子RDD分區一對一(如
五、Shuffle機制
-
定義:數據在分區間重新分布的過程,涉及大量磁盤IO和網絡傳輸,是性能瓶頸。
-
Spark Shuffle類型
- Hash Shuffle:早期實現,小文件過多,已被淘汰。
- Sort Shuffle:主流實現,按Key排序,合并小文件,減少IO。
SortShuffleWriter
:內存排序+溢寫合并。BypassMergeSortShuffleWriter
:非聚合場景優化,避免排序。
-
優化建議
- 啟用Map端預聚合(如
reduceByKey
替代groupByKey
)。 - 調整緩沖區大小(
spark.shuffle.file.buffer
)和并行度(spark.default.parallelism
)。 - 壓縮Shuffle數據(
spark.shuffle.compress
)。
- 啟用Map端預聚合(如
六、內存管理
-
統一內存管理(默認)
- 內存分為:存儲內存(緩存RDD)、執行內存(Shuffle等計算)、其他內存(用戶數據結構)。
- 動態借用機制:存儲與執行內存可互相借用,執行內存可強制收回。
-
配置參數
spark.memory.fraction
:統一內存占JVM堆比例(默認0.6)。spark.memory.storageFraction
:存儲內存占統一內存比例(默認0.5)。
七、應用場景
- 離線批處理(日志分析、數據清洗)。
- 實時流處理(監控告警、實時推薦)。
- 機器學習(模型訓練、預測)。
- 圖計算(社交網絡分析、路徑規劃)。
結尾
Spark Core是Spark生態的基礎,通過內存計算、DAG優化和豐富的算子,大幅提升分布式計算效率。其核心是RDD抽象和Shuffle機制,結合多模式部署和內存管理優化,成為大數據處理的主流引擎。實際應用中需根據場景選擇合適的運行模式和算子,重點優化Shuffle和內存使用以提升性能。
今天這篇文章就到這里了,大廈之成,非一木之材也;大海之闊,非一流之歸也。感謝大家觀看本文