Spark調度底層執行原理詳解(第35天)

系列文章目錄

一、Spark應用程序啟動與資源申請
二、DAG(有向無環圖)的構建與劃分
三、Task的生成與調度
四、Task的執行與結果返回
五、監控與容錯
六、優化策略

文章目錄

  • 系列文章目錄
  • 前言
  • 一、Spark應用程序啟動與資源申請
    • 1. SparkContext的創建
    • 2. 資源申請
  • 二、DAG(有向無環圖)的構建與劃分
    • 1. DAG的構建
    • 2. DAG的劃分
    • 3. DAG的調度執行
    • 4. DAG調度的優化
  • 三、Task的生成與調度
    • 1. Task的生成
    • 2. Task的調度
  • 四、Task的執行與結果返回
    • 1. Task的執行
    • 2. 結果的返回
  • 五、監控與容錯
    • 1. 監控
    • 2. 容錯
  • 六、優化策略
    • 1. 內存計算
    • 2. 智能Shuffle機制
    • 3. 資源管理與調度


前言

Spark調度底層執行原理是一個復雜而精細的過程,它涉及到多個組件的交互和協同工作,以實現大數據處理的高效性和靈活性。本文主要對Spark調度底層執行原理進行詳細解析。

  • Spark調度底層執行原理詳解圖
    在這里插入圖片描述

一、Spark應用程序啟動與資源申請

1. SparkContext的創建

當Spark應用程序啟動時,首先會創建SparkContext對象。SparkContext是Spark的入口點,負責初始化與資源管理器(如YARN、Mesos等)的連接,注冊應用,并請求分配Executor資源。

2. 資源申請

SparkContext向資源管理器注冊并向其申請運行Executor。資源管理器分配Executor資源后,啟動Executor進程。這些Executor是Spark在每個Worker節點上啟動的進程,負責執行具體的Task。

二、DAG(有向無環圖)的構建與劃分

Spark的DAG(Directed Acyclic Graph,有向無環圖)調度原理是Spark作業調度機制的核心部分,它負責將復雜的作業分解成可并行執行的任務集,并通過任務調度器進行高效執行。以下是Spark DAG調度原理的詳細解釋:
在這里插入圖片描述

1. DAG的構建

用戶代碼中包含Transformations(轉換操作)和Actions(行動操作)時,Spark會構建一個DAG來表示RDD(彈性分布式數據集)之間的依賴關系。這些依賴關系決定了數據處理的流程。

  • RDD的依賴關系:
    在Spark中,RDD(彈性分布式數據集)是數據處理的基本單位。RDD之間的依賴關系決定了數據處理的流程和順序。這些依賴關系是有向的,總是由子RDD指向父RDD。
  • DAG的生成:
    當用戶提交一個Spark作業時,Spark會根據RDD之間的依賴關系構建一個DAG。這個DAG表示了作業中所有RDD之間的轉換和行動操作,以及它們之間的數據流動關系。

2. DAG的劃分

  • DAG Scheduler負責將DAG劃分為多個Stage(階段)。Stage的劃分依據是RDD依賴關系中的寬依賴(如shuffle操作)。寬依賴標志著數據重分布的需求,自然成為Stage的邊界。每個Stage包含一組可以并行執行的Task。
  • Stage的劃分:
    如果RDD之間的依賴是窄依賴(即一個父RDD的分區只會被一個子RDD的分區使用),則它們會被劃分到同一個Stage中。如果依賴是寬依賴(即一個父RDD的分區會被多個子RDD的分區使用,通常涉及shuffle操作),則會在寬依賴處進行Stage的劃分。
    Task的生成:
    每個Stage會被進一步劃分為多個Task(任務)。這些Task是Spark實際執行的最小單元,它們將被分發到集群中的Executor上執行。

3. DAG的調度執行

  1. Task的提交與執行:
    DAG Scheduler將劃分好的Stage提交給Task Scheduler。Task Scheduler負責將Stage中的Task分發到集群的Executor上執行。Executor多線程地執行Task,每個線程負責一個Task。
  2. 執行結果的收集:
    當Task執行完成后,會將結果返回給Task Scheduler。Task Scheduler將結果匯總后,通知DAG Scheduler。DAG Scheduler根據Task的執行結果和Stage的依賴關系,決定是否提交下一個Stage執行。
  3. 容錯與重試:
    如果某個Task執行失敗,Task Scheduler會負責重試該Task。如果某個Stage中的所有Task都執行失敗,DAG Scheduler會重新提交該Stage執行。這種容錯機制保證了Spark作業的健壯性和可靠性。

4. DAG調度的優化

  1. 本地性優化:
    Spark在調度Task時,會盡量將Task分配到存儲了所需數據的節點上執行,以減少數據的網絡傳輸開銷。這種本地性優化策略提高了Spark作業的執行效率。
  2. 資源動態分配:
    Spark支持資源的動態分配,即根據作業的執行情況和集群的負載情況動態調整Executor的數量和資源。這種動態分配策略有助于充分利用集群資源,提高資源利用率。
    綜上所述,Spark的DAG調度原理是一個復雜而高效的過程,它通過將作業分解成可并行執行的Stage和Task,并利用DAG Scheduler和Task Scheduler進行高效的調度執行。同時,Spark還通過本地性優化和資源動態分配等策略來優化DAG調度的性能。

三、Task的生成與調度

1. Task的生成

DAG Scheduler將每個Stage轉換為一個或多個TaskSet(任務集),Task Scheduler負責將這些TaskSet分配到各個Executor上執行。

2. Task的調度

Task Scheduler接收DAG Scheduler提交過來的TaskSet,并將Task分發到集群中的Executor上運行。Executor多線程地執行Task,每個線程負責一個Task。

四、Task的執行與結果返回

1. Task的執行

Task在Executor上執行,處理數據,并將結果返回給Driver。對于ShuffleMapTask,計算結果會寫入BlockManager中,并返回給DAG Scheduler一個MapStatus對象,存儲BlockManager的基本信息,這些信息將成為下一個階段任務獲取輸入數據的依據。

2. 結果的返回

對于ResultTask(最終任務),返回的是func函數的計算結果。這些結果會被發送到Driver端,供用戶程序進一步處理或展示。

五、監控與容錯

1. 監控

DAGScheduler監控Job與Task的完成情況,通過回調函數接收TaskScheduler的通知,了解任務的開始、結束、失敗等信息,以維護作業和調度階段的狀態信息。

2. 容錯

如果某個Executor失敗,DAGScheduler會根據RDD的依賴關系重新計算丟失的分區。Spark通過RDD的Lineage(血統)進行容錯,確保數據的完整性和一致性。

六、優化策略

1. 內存計算

Spark利用內存進行計算加速,通過存儲RDD的分區在內存中來避免頻繁的磁盤讀寫。這大大提高了數據處理的效率。

2. 智能Shuffle機制

在涉及寬依賴的Stage間,數據需經過Shuffle過程重分布。Spark使用了基于排序的Shuffle機制,優化了數據處理的效率和內存使用。

3. 資源管理與調度

Spark通過智能的資源管理與調度策略,如FIFO調度策略等,確保任務的高效執行。同時,Spark還優化了數據處理的本地性,優先安排Task在數據所在的節點上執行,以減少網絡傳輸和提高執行效率。
綜上所述,Spark調度底層執行原理是一個復雜而精細的過程,它通過高度優化的DAG執行模型、內存計算、智能的Shuffle機制和強大的資源管理與調度策略,實現了大數據處理的高效性和靈活性。

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

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

相關文章

力扣1111.有效括號的嵌套深度

力扣1111.有效括號的嵌套深度 棧模擬 對于每個括號求出深度 奇數深度存入A&#xff0c;偶數深度存入B這樣最大程度降低最大深度 class Solution {public:vector<int> maxDepthAfterSplit(string s) {//因為棧中只會存(的數量 所有用一個變量即可int d 0;vector<i…

Python | Leetcode Python題解之第233題數字1的個數

題目&#xff1a; 題解&#xff1a; class Solution:def countDigitOne(self, n: int) -> int:# mulk 表示 10^k# 在下面的代碼中&#xff0c;可以發現 k 并沒有被直接使用到&#xff08;都是使用 10^k&#xff09;# 但為了讓代碼看起來更加直觀&#xff0c;這里保留了 kk,…

C語言內存管理深度解析面試題及參考答案(2萬字長文)

在嵌入式面試時,C語言內存管理是必問面試題,也是難點,相關知識點可以參考: C語言內存管理深度解析??????? 下面整理了各種類型的C語言內存管理的面試題: 目錄 全局變量和局部變量在內存中分別存儲在哪個區域? 靜態變量和全局變量有什么區別? 什么是作用域?…

ORM Bee,如何使用Oracle的TO_DATE函數?

ORM Bee,如何使用Oracle的TO_DATE函數? 在Bee V2.4.0,可以這樣使用: LocaldatetimeTable selectBeannew LocaldatetimeTable();Condition conditionBF.getCondition();condition.op("localdatetime", Op.ge, new TO_DATE("2024-07-08", "YYYY-MM-DD&…

如何選擇適合的分布式鎖技術

1. Redis鎖 優勢&#xff1a; 性能高&#xff1a;Redis作為內存數據庫&#xff0c;讀寫速度非常快&#xff0c;因此Redis鎖在性能上表現優異。 實現方便&#xff1a;Redis提供了豐富的命令集&#xff0c;可以方便地實現分布式鎖的邏輯。 劣勢&#xff1a; 可靠性&#xff1a…

Excel第31享:基于left函數的截取式數據裂變

1、需求描述 如下圖所示&#xff0c;在“Excel第30享”中統計2022年YTD各個人員的“上班工時&#xff08;a2&#xff09;”&#xff0c;需要基于工時明細表里的“日期”字段建立輔助列&#xff0c;生成“年份”字段&#xff0c;本文說明“年份”字段是怎么裂變而來的。 下圖為…

systemverilog的關聯數組

關聯數組定義 在 SystemVerilog 中&#xff0c;關聯數組&#xff08;Associative Arrays&#xff09;是一種非常靈活的數據結構&#xff0c;它可以使用任意類型的鍵&#xff08;key&#xff09;來索引數組中的元素。這使得關聯數組特別適合于實現類似哈希表&#xff08;hash t…

圖像處理:使用 OpenCV-Python 卡通化你的圖像(2)

一、說明 在圖像處理領域&#xff0c;將圖像卡通化是一種新趨勢。人們使用不同的應用程序將他們的圖像轉換為卡通圖像。如今&#xff0c;玩弄圖像是許多人的愛好。人們通常會點擊圖片并添加濾鏡或使用不同的東西自定義圖像并將其發布到社交媒體上。但我們是程序員&#xff0c;…

后端老鳥的前端初探:心得與領悟20240713

&#x1f389; 后端老鳥的前端初探&#xff1a;心得與領悟 &#x1f680; 作為一名深耕后端多年的開發者&#xff0c;我最近踏上了前端探索的征程。這段跨界之旅讓我有了許多深刻的心得與領悟&#xff0c;現在我想和大家細細分享&#xff1a; 前端技術的飛速更新 &#x1f68…

godis源碼分析——Redis協議解析器

前言 redis這個目錄下的所有代碼就是為了一個事情&#xff0c;就是適配redis。 流程 redis下的基本流程 源碼 在redis/client/client.go 主要是客戶端處理 package clientconst (created iotarunningclosed )type B struct {data chan stringticker *time.Ticker }// …

Docker安裝RabbitMQ(帶web管理端)

1.拉取帶web管理的鏡像 可以拉取rabbitmq對應版本的web管理端&#xff0c;比如&#xff1a;rabbitmq:3.9.11-management&#xff0c;也可以直接拉取帶web管理端的最新版本 rabbitmq:management. docker pull rabbitmq:3.9.11-management 注意&#xff1a;如果docker pull ra…

sqlalchemy使用with_entities返回指定數據列

sqlalchemy使用with_entities返回指定數據列 在 SQLAlchemy 中,with_entities 方法用于指定查詢語句返回的實體(Entity)或列(Column)。它允許你限制查詢的返回結果,只包含你感興趣的特定字段或實體 使用方法 假設有一個名為 User 的 SQLAlchemy 模型類,包含以下字段:…

Unity3D中如何降低游戲的Drawcall詳解

在Unity3D游戲開發中&#xff0c;Drawcall是一個至關重要的性能指標&#xff0c;它指的是CPU通知GPU繪制一個物體的命令次數。過多的Drawcall會導致游戲性能下降&#xff0c;因此優化Drawcall的數量是提高游戲性能的關鍵。本文將詳細介紹Unity3D中降低Drawcall的幾種主要方法&a…

設計模式使用場景實現示例及優缺點(行為型模式——模板方法模式)

模板方法模式&#xff08;Template Method Pattern&#xff09; 模板方法模式&#xff08;Template Method Pattern&#xff09;是一種行為設計模式&#xff0c;它定義了一個操作中的算法的骨架&#xff0c;將算法的一些步驟延遲到子類中。這樣可以在不改變算法的結構的前提下…

Git使用介紹教程

Git使用介紹教程 小白第一次寫博客,內容寫的可能不是很詳細,僅供參考,大家一起努力 gitee網址:https://gitee.com 大部分的開發團隊都以 Git 作為自己的版本控制工具,需要對 Git 的使用非常的熟悉。這篇文章中本人整理了自己在開發過程中經常使用到的 Git 命令,方便在偶…

jenkins系列-06.harbor

https://github.com/goharbor/harbor/releases?page2 https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz harbor官網&#xff1a;https://goharbor.io/ 點擊 Download now 鏈接&#xff0c;會自動跳轉到上述github頁面&am…

C++ | Leetcode C++題解之第233題數字1的個數

題目&#xff1a; 題解&#xff1a; class Solution { public:int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代碼中&#xff0c;可以發現 k 并沒有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但為了讓代碼看起來更加直觀&#xff0c;這里保留了 klong l…

Redis系列命令更新--Redis哈希命令

一、設置密碼驗證&#xff1a; 使用文本編輯器&#xff0c;這里使用Notepad&#xff0c;打開Redis服務配置文件。 注意&#xff1a;不要找錯了&#xff0c;通常為redis.windows-service.conf&#xff0c;而不是redis.windows.conf。后者是以非系統服務方式啟動程序使用的配置…

使用個人p12證書請求https接口數據

依賴 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version></dependency>code package com.hexin.cbas.test;import org.apache.commons.net.util.TrustM…

《BASeg: Boundary aware semantic segmentation for autonomous driving》論文解讀

期刊&#xff1a;Neural Networks | Journal | ScienceDirect.com by Elsevier 年份&#xff1a;2023 代碼&#xff1a;https://github.com/Lature-Yang/BASeg 摘要 語義分割是自動駕駛領域街道理解任務的重要組成部分。現有的各種方法要么專注于通過聚合全局或多尺度上下文…