Spark 分布式彈性計算集(RDD)相關概念介紹

目錄

一、概述

二、RDD的核心概念

2.1 Partition

2.2 Partitioner

2.3 RDD的依賴關系

2.4 Stage

2.5 PreferredLocation

2.6 CheckPoint

三、RDD的持久化

3.1 概述

3.2 概念

3.3 RDD持久化級別

3.3.1 MEMORY_ONLY

3.3.2 MEMORY_AND_DISK

3.3.3 MEMORY_ONLY_SER

3.3.4 OMEMORY_AND_DISK_SER

3.3.5 DISK_ONLY

3.3.6 MEMORY_ONLY2和MEMORY_AND_DISK2

3.3.7 OFF_HEAP

3.4 RDD 持久化原則

3.5 刪除RDD持久化緩存


一、概述

RDD是 Spark 中最基本的數據抽象,代表一個不可變、可分區、元素可并行計算的集合。RDD具有自動容錯、位置感知性調度和可伸縮等特點。RDD 允許用戶在執行多個查詢時顯式地將數據集緩存在內存中,后續查詢能夠重用該數據集,這極大地提升了查詢效率。

二、RDD的核心概念

2.1 Partition

RDD內部的數據集在邏輯上和物理上都被劃分為多個分區(Partition)以提高運行的效率,分區數量決定了計算的并行度,每一個分區內的數據都在一個單獨的任務中被執行,如果在計算過程中沒有指定分區數,那么 Spark 會采用默認分區數量。默認分區數量為程序運行分配到的CPU核數。

2.2 Partitioner

Partitioner 是 RDD的分區函數。分區函數不但決定了 RDD本身的分區數量,也決定了其父 RDD Shuffle 輸出時的分區數量。Spark 實現了基于 Hash(HashPartitioner)和基于范圍(RangePartitioner)的兩種分區函數。

注意:只有對于Key-Value的RDD才會有 Partitioner,而非 Key-Value的RDD的Parititioner 值是None。

2.3 RDD的依賴關系

RDD的每次轉換都會生成一個新的 RDD,因此RDD之間會有前后依賴關系。當在計算過程中出現異常情況導致部分分區數據丟失時,Spark 可以通過依賴關系從父 RDD 中重新計算丟失的分區數據,而不需要對 RDD上的所有分區全部重新計算。RDD的依賴分為窄依賴和寬依賴。

  • ?窄依賴:如果父 RDD的每個分區最多只能被子RDD的一個分區使用,則稱之為窄依賴。
  • 寬依賴:如果父 RDD的每個分區都可以被子RDD的多個分區使用,則稱之為寬依賴。

窄依賴的每個子RDD的Partition 的生成操作都是可以并行的,而寬依賴則需要所有父Partition Shuffle結果完成后再被執行。Spark的窄依賴和寬依賴如圖所示:

2.4 Stage

Stage 是由一組 RDD組成的可進行優化的執行計劃。如果 RDD的依賴關系為窄依賴,則可放在同一個 Stage 中運行;若 RDD的依賴關系為寬依賴,則要劃分到不同Stage 中。這樣,當Spark 執行作業時,會按照Stage 劃分不同的RDD,生成一個完整的最優的執行計劃,使每個 Stage 內的 RDD都盡可能在各個節點上并行地被執行,

如圖所示:

階段三 包含 階段一和 階段二,其中,階段一為寬依賴,階段二為窄依賴。

2.5 PreferredLocation

PreferredLocation 是一個用于存儲每個 Partition 的優先位置的列表。對于每個 HDFS文件來說,這個列表保存的是每個 Partition 所在的塊的位置也就是該HDFS文件的“劃分點”。

2.6 CheckPoint

CheckPoint 是Spark 提供的一種基于快照的緩存機制。當需要計算的 RDD 過多時,為了避免任務執行失敗后重新計算之前的 RDD,可以對 RDD 做快照(CheckPoint)處理,檢查 RDD 是否被計算,并將結果持久化到磁盤或 HDFS 上。

此外Spark 提供另一種緩存機制 Cache,Cache 緩存數據由 Executor 管理,當Executor 消失時Cache 緩存的數據將被清除,而 CheckPoint將數據保存到永久性磁盤或HDFS,當計算出現運行錯誤時,Job可以從CheckPoint 點繼續計算。

三、RDD的持久化

3.1 概述

Spark 可以跨節點在內存中持久化 RDD。當持久化 RDD時,每個節點都會在內存中緩存計算后的分區數據,當其他操作需要使用該 RDD 時,可以直接重用該緩存數據,這使得之后的 RDD 計算速度更快(通常超過10倍)。緩存是選代計算和交式計算的關鍵。

3.2 概念

應用程序可以使用 persist0或 cache0標記要緩存的 RDD,當調用操作(Action)執行計算時,計算結果將被緩存在節點的內存中。Spark 緩存具有容錯性,如果 RDD的某個分區丟失,則該RDD將被自動重新計算。

每個持久化 RDD 都可以使用不同存儲級別進行存儲,Spark 允許將數據集存儲在磁盤上或內存中。Spark 將需要緩存的數據序列化為 Java 對象(序列化可以節省磁盤或內存空間),然后跨節點復制到其他節點上,以便其他節點重用該數據。Spark 中緩存持久化級別是通過StorageLevel來設置的。具體代碼如下

lineLengths.persist(storageLevel.MEMORY_ONLY());

3.3 RDD持久化級別

3.3.1 MEMORY_ONLY

使用未經過序列化的 Java 對象在內存中存儲 RDD。當內存不夠時,將不會進行持久化:當下次需要該 RDD 時,再從源頭處重新計算。該策略是默認的持久化策略,當使用 cache()時,使用的是該持久化策略。

3.3.2 MEMORY_AND_DISK

使用未經過序列化的 Java 對象存儲 RDD,優先嘗試將RDD保存在內存中。如果內存不夠,則會將 RDD寫人磁盤文件;當下次需要該 RDD時從持久化的磁盤文件中讀取該 RDD 即可。

3.3.3 MEMORY_ONLY_SER

MEMORY_ONLY_SER 的含義與 MEMORY_ONLY 類似唯一區別是MEMORY_ONLY_SER 會將 RDD中的數據進行序列化。在序列化過程中,RDD的每個 Partition 都將會被序列化成一個字節數組,這種方式更加節省內存,從而避免持久化的RDD占用過多內存導致JVM頻繁GC。

3.3.4 OMEMORY_AND_DISK_SER

MEMORY_AND_DISK_SER 的含義與 MEMORY_AND_DISK類似。唯一區別是MEMORY_AND_DISK_SER會將RDD中的數據進行序列化。在序列化過程中,RDD的每個 Partition 都會被序列化成一個字節數組。這種方式更

加節省內存,從而避免持久化的 RDD占用過多內存導致頻繁GC。

3.3.5 DISK_ONLY

使用未序列化的Java對象將 RDD全部寫人磁盤文件。

3.3.6 MEMORY_ONLY2和MEMORY_AND_DISK2

對于上述任意一種持久化策略如果加上后綴 2,代表的是將每個持久化的數據都復制一份副本,并將副本保存到其他節點上。這種基于副本的持久化機制主要用于容錯。假如某個節點掛掉,節點的內存或磁盤中的持久化數據丟失了,那么后續對 RDD 計算時還可以使用該數據在其他節點上的副本。如果沒有副本,則只能將這些數據從頭重新計算一遍。

3.3.7 OFF_HEAP

OFF_HEAP與MEMORY_ONLY_SER類似,OFF_HEAP將數據存儲在堆外內存中。該參數需要Spark 啟用堆外內存。

3.4 RDD 持久化原則

Spark 提供了豐富的存儲級別,旨在通過不同存儲級別的設置實現內存和CPU的最佳使用,具體開發中該如何選擇持久化方案呢?以下為 Spark 官方提供的緩存持久化的選擇流程。

  1. 如果RDD在默認存儲級別(MEMORYONLY)下運行良好,則建議使用MEMORY_ONLY。該級別是CPU效率最高的類型,基于CPU快速計算可以使 RDD上的操作盡可能快地運行。
  2. 如果系統顯示內存使用過高,則嘗試使用MEMORY_ONLY_SER,并選擇更快速的序列化庫,以加快序列化時間和節省對象的存儲空間。
  3. 如果要快速恢復故障,則建議使用副本存儲級別。其他存儲級別需要通過重新計算丟失的數據來保障緩存的完整性,而副本存儲級別可以在其緩存對應的副本節點上直接執行任務,不用等待重新計算丟失的分區數據

3.5 刪除RDD持久化緩存

Spark 會自動監視每個節點上的緩存使用情況,并以 LRU方式刪除舊的數據分區如果想手動刪除RDD,則可通過RDD.unpersist()方法完成。

今天Spark RDD的相關內容就分享到這里,可以關注Spark專欄《Spark》,后續不定期分享相關技術文章。如果幫助到大家,歡迎大家點贊+關注+收藏,有疑問也歡迎大家評論留言!

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

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

相關文章

基于語義的法律問答系統

第一步,準備數據集 第二步,構建索引數據集,問答對數據集,訓練數據集,召回評估數據集 第三步,構建dataloader,選擇優化器訓練模型,之后召回評估 第四步,模型動轉靜,之后…

Synchronized底層工作原理

Synchronized 是Java中最常用的內置鎖機制,用于確保多線程環境下的同步。其底層原理涉及到JVM(Java虛擬機)和字節碼指令。以下是 synchronized 的底層工作原理的詳細介紹: 1. 基本概念 對象頭(Object Header&#xf…

【UE5.1 角色練習】15-槍械射擊——子彈發射物

目錄 效果 步驟 一、創建并發射子彈 二、優化子彈 效果 步驟 一、創建并發射子彈 1. 在前面的文章中(【UE5.1 角色練習】06-角色發射火球-part1)我們創建了藍圖“BP_Skill_FireBall” 這里我們復制一份命名為“BP_Ammo_5mm”,用于表示…

科技的成就(六十一)

567、數據虛擬化 用來描述所有數據管理方法的涵蓋性術語,這些方法允許應用程序檢索并管理數據,且不需要數據相關的技術細節,例如它格式化的方式或物理位置所在。數據整合的過程,以此獲得更多的數據信息,這個過程通常會…

SLAM中的塊矩陣與schur補

文章目錄 SLAM中的塊矩陣與schur補Schur補的另一種解釋對角塊矩陣的逆為各個塊的逆的組合 SLAM中的塊矩陣與schur補 Schur補的另一種解釋 Schur從概率角度來解釋是比較常見的一種推導,可以參考博客https://blog.csdn.net/weixin_41469272/article/details/1219944…

若依搭建 帝可得 售貨機 筆記

一、搭建項目 1.后端gitee鏈接: 啟動項目時記得修改mysql和redis的相關信息;創建項目相關數據庫,并導入初始化的SQL腳本 dkd-parent: 帝可得后臺管理系統 (gitee.com) 2.前端gitee鏈接: 啟動項目時記得安裝依賴:np…

Github Action 自動部署更新靜態網頁服務

本文首發于 Anyeの小站,點擊跳轉 獲得更優質的閱讀體驗 前言 貼一段胡話 在用過 應用:靜態網頁服務 之后,事實證明: 總而言之,自動化是一個很令人著迷的東西,擺脫重復繁瑣的工作,解放了雙手的…

JCR一區 | Matlab實現GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征輸入數據分類預測/故障診斷

JJCR一區 | Matlab實現GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征輸入數據分類預測/故障診斷 目錄 JJCR一區 | Matlab實現GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征輸入數據分類預測/故障診斷分類效果格拉姆矩陣圖GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介紹程序設計參考資料 分…

【45 Pandas+Pyecharts | 去哪兒海南旅游攻略數據分析可視化】

文章目錄 🏳??🌈 1. 導入模塊🏳??🌈 2. Pandas數據處理2.1 讀取數據2.2 查看數據信息2.3 日期處理,提取年份、月份2.4 經費處理2.5 天數處理 🏳??🌈 3. Pyecharts數據可視化3.1 出發日期_…

華南師范大學“大學生校外實踐教學基地”授牌儀式暨見習參觀活動圓滿結束

為促進校企合作的深入發展,培育出具有實際應用技能的人才,7月9日,華南師范大學數學科學院與廣東泰迪智能科技股份有限公司聯合開展“大學生校外實踐教學基地”授牌儀式暨見習參觀活動。華南師范大學數學科學院數據科學系主任陳艷男、副主任陳…

深入理解model.eval()與torch.no_grad()

model.eval() 使用model.eval()切換到測試模式,不會更新模型的w(權重),b(偏置)參數通知dropout層和batchnorm層在train和val中間進行切換: 在train模式,dropout層會按照設定的參數p…

Idea 2023 使用GitLab提交代碼提示輸入Token

項目場景: 今天電腦換硬盤了,安裝了 IDEA2023 款的社區版開發工具,下載代碼后,提交并推送代碼到遠程服務器的時候,提示輸入Token,并不是用戶名和密碼。 問題描述 推送代碼到遠程GitLab本地倉庫的時候&…

單鏈表--續(C語言詳細版)

2.6 在指定位置之前插入數據 // 在指定位置之前插入數據 void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x); 分為兩種情況:1. 插入的數據在鏈表中間;2. 插入的數據在鏈表的前面。 // 在指定位置之前插入數據 void SLTInsert(SLTNode** …

AI繪畫何以突飛猛進? 從歷史到技術突破, 一文讀懂火爆的AI繪畫發展史

前言 自從前段時間偶然間被當下AI繪畫的水平震住之后(超越一切的AI作畫神器,和它創作的234個盔甲美女未來戰士) ,作者深感當今AI繪畫的飛速進展或許已遠超所有人的預期。 而這里的前因后果,包括AI繪畫的歷史&#xff…

十九.升職加薪系列-JVM優化-解決JVM性能瓶頸的JIT即時編譯器

前言 在很多年以前,做C或者C的程序員經常說Java語言的運行速度不如C或C,Java運行速度慢主要是因為它是解釋執行的,而C或C是編譯執行的,解釋執行需要通過JVM虛擬機將字節碼實時翻譯成機器碼(邊翻譯邊執行)&…

Rust 版本升級:rustup update stable 報錯

Rust 版本升級 rustup update stable 報錯 一、報錯內容 error: could not download file from ‘https://static.rust-lang.org/dist/channel-rust-stable.toml.sha256’ to ‘/Users/xxx/.rustup/tmp/rv6vdfu3eupwo64m_file’: failed to make network request: error sendi…

【實戰場景】@Transactional中使用for update的注意點

【實戰場景】Transactional中使用for update的注意點 開篇詞:干貨篇:知識回顧注意點1.鎖的范圍和粒度:2.事務的隔離級別:3.死鎖:4.性能影響:5.事務的邊界:6.異常處理:7. 數據庫和存儲…

【漏洞復現】網神 SecGate 3600 防火墻 sys_export_conf_local_save 任意文件讀取

免責聲明: 本文內容旨在提供有關特定漏洞或安全漏洞的信息,以幫助用戶更好地了解可能存在的風險。公布此類信息的目的在于促進網絡安全意識和技術進步,并非出于任何惡意目的。閱讀者應該明白,在利用本文提到的漏洞信息或進行相關測…

javaweb學習day5--《HTML篇》Springboot的模塊創建、HTML的相關知識點詳解

一、前言 從今天開始,就要啟動后端的學習了,Springboot會貫穿到底,一定要跟著小編嚴謹的去搭建Springboot環境,依賴添加的過程可能需要2分鐘左右,讀者們要耐心等待一下,搭建好Springboot之后才算正式的開始…

算力革命:彈性租賃,解鎖無限可能

華為創始人任正非曾在一場程序設計競賽中說道,我們即將進入第四次工業革命,基礎就是大算力。事實上,隨著5G、人工智能等信息技術的迅猛發展,算力需求持續增長,但高昂的成本和快速的技術迭代讓許多中小企業和個人開發者…