Spark教程6:Spark 底層執行原理詳解

文章目錄

        • 一、整體架構概述
        • 二、核心組件詳解
          • 1. SparkContext
          • 2. DAG Scheduler
          • 3. Task Scheduler
          • 4. Executor
        • 三、作業執行流程
          • 1. DAG 生成與 Stage 劃分
          • 2. Task 調度與執行
          • 3. 內存管理
        • 四、Shuffle 機制詳解
          • 1. Shuffle 過程
          • 2. Shuffle 優化
        • 五、內存管理機制
          • 1. 統一內存管理(Unified Memory Management)
          • 2. Tungsten 優化
        • 六、容錯機制
          • 1. Lineage(血統)
          • 2. Checkpoint
          • 3. 任務重試
        • 七、調度策略
          • 1. 任務調度
          • 2. 推測執行
        • 八、性能優化關鍵點
          • 1. 數據本地性
          • 2. 并行度調整
          • 3. 內存調優
        • 九、高級特性
          • 1. Catalyst 優化器
          • 2. Tungsten 項目
        • 十、監控與調試工具
          • 1. Spark UI
          • 2. 事件日志
          • 3. Spark 性能調優工具

一、整體架構概述

Spark 采用主從架構(Master-Slave),主要組件包括:

  • Driver Program:運行用戶應用的 main 函數,負責創建 SparkContext、分析作業、調度任務。
  • Cluster Manager:資源管理器,如 YARN、Mesos、Standalone
  • Worker Node:集群中的工作節點,負責執行具體任務。
  • ExecutorWorker 節點上的進程,負責運行任務并緩存數據。

執行流程

  1. 用戶提交應用,Driver 啟動并創建 SparkContext
  2. SparkContext 連接 Cluster Manager,請求資源。
  3. Cluster Manager 分配資源,在 Worker 節點上啟動 Executor
  4. Driver 將任務分發給 Executor 執行。
  5. ExecutorDriver 匯報任務狀態和結果。
二、核心組件詳解
1. SparkContext
  • Spark 應用的入口,負責與 Cluster Manager 通信,協調資源分配。
  • 管理 RDD 的依賴關系(血統圖),并生成 DAG(有向無環圖)。
2. DAG Scheduler
  • 將作業(Job)分解為多個階段(Stage),每個階段包含多個任務(Task)。
  • 根據 RDD 的依賴關系劃分 Stage
    • 寬依賴(如 shuffle)會觸發新的 Stage
    • 窄依賴(如 map、filter)會被合并到同一個 Stage
3. Task Scheduler
  • Task 分配給具體的 Executor 執行。
  • 負責任務調度、重試失敗的任務,以及處理推測執行(Speculative Execution)。
4. Executor
  • 負責執行 Task,并將結果返回給 Driver
  • 維護內存緩存,存儲 RDD 分區數據。
三、作業執行流程
1. DAG 生成與 Stage 劃分
# 示例代碼
rdd = sc.textFile("data.txt")  # 讀取文件,創建 RDD
words = rdd.flatMap(lambda line: line.split())  # 轉換操作
pairs = words.map(lambda word: (word, 1))  # 轉換操作
counts = pairs.reduceByKey(lambda a, b: a + b)  # 觸發 Shuffle
counts.collect()  # 動作操作,觸發作業執行

執行流程

  1. collect() 觸發作業提交。
  2. DAG Scheduler 將作業劃分為兩個 Stage
    • Stage 1:執行 textFile、flatMap、map 操作。
    • Stage 2:執行 reduceByKeycollect 操作,依賴于 Stage 1 的輸出。
2. Task 調度與執行
  • ShuffleMapTask:執行 Stage 1 的任務,輸出中間結果(Shuffle 文件)。
  • ResultTask:執行 Stage 2 的任務,讀取 Shuffle 文件并聚合結果。
3. 內存管理
  • Storage Memory:存儲緩存的 RDDDataFrame
  • Execution Memory:執行 Shuffle、聚合、排序等操作的內存。
  • User Memory:用戶代碼使用的內存。
四、Shuffle 機制詳解
1. Shuffle 過程
  1. Map 端

    • 將數據分區并寫入內存緩沖區。
    • 緩沖區滿時溢寫到磁盤,生成多個小文件。
    • 最終合并所有小文件為一個大文件,并生成索引。
  2. Reduce 端

    • 從各個 Map 任務拉取屬于自己的數據。
    • 合并數據并按 key 排序。
    • 執行聚合或其他操作。
2. Shuffle 優化
  • Sort Shuffle:默認實現,減少文件數量。
  • Tungsten-Sort Shuffle:基于內存管理框架 Tungsten,提高效率。
  • 自適應執行(Spark 3.0+):動態調整 Shuffle 分區數。
五、內存管理機制
1. 統一內存管理(Unified Memory Management)
  • Spark 1.6+ 引入,StorageExecution 內存可相互借用:
    # 內存配置參數
    spark.memory.fraction = 0.6  # 統一內存占堆內存的比例
    spark.memory.storageFraction = 0.5  # Storage 內存占統一內存的比例
    
2. Tungsten 優化
  • 堆外內存:減少 GC 壓力,提高內存訪問效率。
  • 二進制格式:直接操作二進制數據,避免 Java 對象開銷。
六、容錯機制
1. Lineage(血統)
  • RDD 記錄其創建過程(依賴關系),當部分分區丟失時,可通過重新計算恢復。
2. Checkpoint
  • RDD 寫入可靠存儲(如 HDFS),切斷血統關系,用于長依賴鏈的 RDD
    rdd.checkpoint()  # 設置檢查點
    
3. 任務重試
  • Task 失敗時,Task Scheduler 會自動重試(默認 4 次)。
七、調度策略
1. 任務調度
  • FIFO(默認):先進先出。
  • FAIR:公平調度,支持多作業共享資源。
    # 啟用公平調度
    spark.conf.set("spark.scheduler.mode", "FAIR")
    
2. 推測執行
  • 當某個任務執行緩慢時,會在其他節點啟動副本任務,取最先完成的結果。
    # 啟用推測執行
    spark.conf.set("spark.speculation", "true")
    
八、性能優化關鍵點
1. 數據本地性
  • PROCESS_LOCAL:數據在同一 JVM 內,最快。
  • NODE_LOCAL:數據在同一節點,但需跨進程傳輸。
  • RACK_LOCAL:數據在同一機架的不同節點。
  • ANY:數據在任意位置。
2. 并行度調整
  • 根據集群資源設置合理的并行度:
    # 設置默認并行度
    spark.conf.set("spark.default.parallelism", 200)
    
3. 內存調優
  • 調整 Executor 內存和堆外內存:
    spark.executor.memory = 8g
    spark.memory.offHeap.enabled = true
    spark.memory.offHeap.size = 2g
    
九、高級特性
1. Catalyst 優化器
  • Spark SQL 的查詢優化器,將 SQL 查詢轉換為高效的物理執行計劃:
    • 分析:解析 SQL 語句,檢查表和列是否存在。
    • 邏輯優化:應用規則優化邏輯計劃(如謂詞下推、投影修剪)。
    • 物理計劃生成:生成多個物理計劃并選擇最優。
    • 代碼生成:將執行計劃編譯為 Java 字節碼。
2. Tungsten 項目
  • 優化內存和 CPU 利用率:
    • 二進制數據處理,減少內存占用。
    • 避免 Java 對象開銷,直接操作內存。
十、監控與調試工具
1. Spark UI
  • 查看作業、階段、任務的執行情況,內存使用等指標。
2. 事件日志
  • 記錄作業執行的詳細信息,可用于離線分析:
    # 啟用事件日志
    spark.eventLog.enabled = true
    spark.eventLog.dir = "hdfs:///spark-logs"
    
3. Spark 性能調優工具
  • Shuffle 調優:分析 Shuffle 性能瓶頸。
  • SQL 執行計劃分析:查看 SQL 查詢的優化過程。

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

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

相關文章

xlsx-style 插件批量導出多個sheet表格excel中遇到的問題及解決

Vue2中 前端界面導出表格,使用XLSXS插件版本(^0.8.13)導出表格存在表格背景顏色無法正常展示,百分比數據沒有正常展示 【有條件的盡量先升級高版本插件,此插件版本對樣式支持度不夠】 優先考慮插件版本升級 同樣的使用方法在vue3中沒有出現錯…

Java后端與Vue前端項目部署全流程:從環境配置到Nginx反向代理

文章目錄 1. 準備項目所需的環境2. 后端項目打包步驟 1:使用 Maven 打包步驟 2:定位生成的 JAR 包步驟 3:上傳 JAR 包到 Linux 系統步驟 4:驗證 Java 環境步驟 5:啟動 JAR 包 3. 前端項目打包步驟 1:執行 B…

Mybatis踩坑之一天

background: 對接AML系統,日間實時需要送交易對手要素過去(目前主要是交易對手全名),夜間需要將歷史交易送AML進行回溯,交互方式是文件。文件要素為日期、對手類型、對手名、交易流水之類。 設置對送AML的文件設計表…

【PyTorch】分布式訓練報錯記錄-ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1)

最近,我在服務器上起基于PyTorch分布式框架的預訓練實驗,起初實驗都在順利進行,但是當我們把模型的深度與寬度調大之后,模型在訓練幾代之后便會出現如下的報錯: WARNING:torch.distributed.elastic.multiprocessing.a…

有哪些詞編碼模型

有哪些詞編碼模型 詞編碼模型:是將自然語言符號映射為稠密的高維向量,使語義相近的詞匯在向量空間中位置接近。 不過,也有部分模型會考慮字母或字符信息,如基于字節對編碼(BPE)的模型會將單詞拆分成子詞,這里的子詞可能是字母組合。 詞編碼模型的原理主要是通過機器學…

Mono 功能介紹與使用示例

Mono 功能介紹與使用示例 一、核心概念與特性 Mono 是 Spring Reactor 框架中的核心組件,屬于響應式編程(Reactive Programming)模型,專注于處理包含 0 或 1 個元素 的異步序列[1][2][5]。其核心特點包括: 異步非阻…

5060Ti雙顯卡+LLaMA-factory大模型微調環境搭建

查看環境確定安裝版本安裝CUDA12.8安裝Anaconda安裝Visual Studio C桌面開發環境(編譯llama.cpp需要)安裝cmake(編譯llama.cpp需要)安裝llama.cpp(用于量化)安裝huggingface-cli安裝llama-factory安裝PyTorch2.7.0安裝bitsandbytes安裝flash-attention加…

Lnmp和XunRuiCMS一鍵部署(Rocky linux)

先上傳XunRuiCMS-Study.zip包到當前目錄,可以去官網下載 #!/bin/bash # function: install nginx mysql php on Rocky Linux 9.5 with fixed PHP-FPM configip$(hostname -I | awk {print $1}) yhxunrui passwordxunrui123# 檢查是否為root用戶 if [ "$USER&qu…

高精度OFDR設備在CPO交換機中的應用

光電共封裝(CPO)交換機的特點 核心需求:CPO將光模塊與交換芯片集成封裝,縮短電互連距離,降低功耗和延遲,但需解決以下挑戰: 1.光器件微型化:硅光芯片、光纖陣列等需高精度制造。 …

Vulkan 通過 CMake 集成 Dear ImGUI

一、 目錄與文件部署 從官網獲取 IMGUI 代碼庫,在項目 extern 目錄下新建 imgui 目錄,將相關文件復制進去,構建出如下目錄結構: . ├── build ├── extern │ ├── glfw │ ├── glm │ └── imgui │ ├…

Linux設備框架:kset與kobject基本介紹

系列文章目錄 Linux設備框架:kset與kobject基本介紹 [link] Linux設備框架:kset與kobject源碼分析 [link] kset與kobject基本介紹 一、前言二、kobject、kset和設備的關系2.1 kset 結構體2.2 kobject 結構體 三、總結 一、前言 Linux 設備模型如同一座擁…

【AI論文】擴展大型語言模型(LLM)智能體在測試時的計算量

摘要:擴展測試時的計算量在提升大型語言模型(LLMs)的推理能力方面已展現出顯著成效。在本研究中,我們首次系統地探索了將測試時擴展方法應用于語言智能體,并研究了該方法在多大程度上能提高其有效性。具體而言&#xf…

LeapMotion-PhysicalHandsManager 類詳解

PhysicalHandsManager 類詳解 這個類是 Ultraleap 物理手交互系統的核心管理器,負責處理手部物理交互的不同模式。下面我將詳細解析這個類的結構和功能: 類概述 PhysicalHandsManager 繼承自 LeapProvider,是物理手交互系統的中央控制器: public class PhysicalHandsMa…

vue-22(理解組合式 API:setup、ref、reactive)

Vue.js 中的組合式 API 代表了我們構建和組織組件方式的重大轉變。它為傳統的選項式 API 提供了一種更靈活、更強大的替代方案,尤其適用于復雜的應用程序。本章將深入探討組合式 API 的核心概念:setup函數、ref和reactive,為你構建更可維護、…

【Golang玩轉MCP】-實現一個加減乘除MCP服務

文章目錄 概要1 首先創建一個MCP服務器2 添加MCP工具如何測試我們的MCP服務功能是否正常呢小結 概要 今天我們使用golang簡單實現一個加減乘除MCP服務 1 首先創建一個MCP服務器 s : server.NewMCPServer("Hello World Server","1.0.0",server.WithToolCa…

計算機網絡期末 網絡基礎概述

目錄 網絡的定義歷史發展(了解) 網絡的分類,功能和應用(熟悉) 網絡的組成與結構(理解) 網絡的 OSI 七層參考模型(熟悉) 網絡的 TCP/IP 四次模型(理解) 網絡有關性能指標(掌握) 網絡的定義歷史發展(了解) 計算機網絡是什么 四個階段 總結 網絡 互連網 因特網的…

SwiftUI學習筆記day4: Lecture 4 | Stanford CS193p 2023

Lecture 4 | Stanford CS193p 2023 課程鏈接:https://www.youtube.com/watch?v4CkEVfdqjLw 代碼倉庫:iOS 課程大綱: 簡要課程大綱:SwiftUI 高級主題 Swift 訪問控制(Access Control) 5 個級別&#xff1…

Docker 高級管理——容器通信技術與數據持久化

目錄 一、Docker 容器的網絡模式 1. Bridge 模式 2. Host 模式 3. Container 模式 4. None 模式 5. Overlay 模式 6. Macvlan 模式 7. 自定義網絡模式 二、端口映射 1. 端口映射 2. 隨機映射端口 3. 指定映射端口 (1)固定端口 (…

git操作案例 -設置遠程分支,并提交到新遠程新分支

文章目錄 前言一、分析當前的問題二、修改遠程倉庫地址(一)修改遠程倉庫地址場景 現有保留遠程分支場景替換現有遠程分支 二、 找回已經提交的文件場景:提交后,代碼在本地倉庫但未推送 三、同步遠程分支四、提交到新遠程的新分支 …

mysql一張表,其中一個字段設置了唯一索引,又設置了普通索引,查詢的時候很慢,沒有走普通索引,是const

問題分析 在 MySQL 中,當一個字段同時存在唯一索引和普通索引時,查詢優化器通常會優先選擇最嚴格的索引(即能最快縮小結果集的索引)。在你的場景中,優化器選擇了唯一索引并將查詢視為const類型,這通常是高…