Spark Cache 的用武之地

在什么情況下適合使用 Cache

我建議你在做決策的時候遵循以下 2 條基本原則:

  • 如果 RDD/DataFrame/Dataset 在應用中的引用次數為 1,就堅決不使用 Cache
  • 如果引用次數大于 1,且運行成本占比超過 30%,應當考慮啟用

Cache第一條很好理解,我們詳細說說第二條。這里咱們定義了一個新概念:運行成本占比。它指的是計算某個分布式數據集所消耗的總時間與作業執行時間的比值。我們來舉個例子,假設我們有個數據分析的應用,端到端的執行時間為 1 小時。應用中有個 DataFrame 被引用了 2 次,從讀取數據源,經過一系列計算,到生成這個 DataFrame 需要花費 12 分鐘,那么這個 DataFrame 的運行成本占比應該算作:12 * 2 / 60 = 40%。
你可能會說:“作業執行時間好算,直接查看 Spark UI 就好了,DataFrame 的運行時間怎么算呢?”這里涉及一個小技巧,我們可以從現有應用中 把 DataFrame 的計算邏輯單拎出來,然后利用 Spark 3.0 提供的 Noop 來精確地得到 DataFrame 的運行時間。假設 df 是那個被引用 2 次的 DataFrame,我們就可以把 df 依賴的所有代碼拷貝成一個新的作業,然后在 df 上調用 Noop 去觸發計算。
Noop 的作用很巧妙,它只觸發計算,而不涉及落盤與數據存儲,因此,新作業的執行時間剛好就是 DataFrame 的運行時間。

//利用noop精確計算DataFrame運行時間
df.write.format("noop").save()

你可能會覺得每次計算占比會很麻煩,但只要你對數據源足夠了解、對計算 DataFrame 的中間過程心中有數了之后,其實不必每次都去精確地計算運行成本占比,嘗試幾次,你就能對分布式數據集的運行成本占比估摸得八九不離十了。

##Cache 的注意事項
弄清楚了應該什么時候使用 Cache 之后,我們再來說說 Cache 的注意事項。首先,我們都知道,.cache是惰性操作,因此在調用.cache之后,需要先用 Action 算子觸發緩存的物化過程。
但是,我發現很多同學在選擇 Action 算子的時候很隨意,first、take、show、count 中哪個順手就用哪個。這肯定是不對的,這 4 個算子中只有 count 才會觸發緩存的完全物化,而 first、take 和 show 這 3 個算子只會把涉及的數據物化。舉個例子,show 默認只產生 20 條結果,如果我們在.cache 之后調用 show 算子,它只會緩存數據集中這 20 條記錄。
選擇好了算子之后,我們再來討論一下怎么 Cache 這個問題。你可能會說:“這還用說嗎?在 RDD、DataFrame 后面調用.cache不就得了”。還真沒這么簡單,我出一道選擇題來考考你,如果給定包含數十列的 DataFrame df 和后續的數據分析,你應該采用下表中的哪種 Cache 方式?

val filePath: String = _
val df: DataFrame = spark.read.parquet(filePath)//Cache方式一
val cachedDF = df.cache
//數據分析
cachedDF.filter(col2 > 0).select(col1, col2)
cachedDF.select(col1, col2).filter(col2 > 100)//Cache方式二
df.select(col1, col2).filter(col2 > 0).cache
//數據分析
df.filter(col2 > 0).select(col1, col2)
df.select(col1, col2).filter(col2 > 100)//Cache方式三
val cachedDF = df.select(col1, col2).cache
//數據分析
cachedDF.filter(col2 > 0).select(col1, col2)
cachedDF.select(col1, col2).filter(col2 > 100)

我們都知道,由于 Storage Memory 內存空間受限,因此 Cache 應該遵循最小公共子集原則,也就是說,開發者應該僅僅緩存后續操作必需的那些數據列。按照這個原則,實現方式 1 應當排除在外,畢竟 df 是一張包含數十列的寬表。
我們再來看第二種 Cache 方式,方式 2 緩存的數據列是col1和col2,且col2數值大于 0。第一條分析語句只是把filter和select調換了順序;第二條語句filter條件限制col2數值要大于 100,那么,這個語句的結果就是緩存數據的子集。因此,乍看上去,兩條數據分析語句在邏輯上剛好都能利用緩存的數據內容。但遺憾的是,這兩條分析語句都會跳過緩存數據,分別去磁盤上讀取 Parquet 源文件,然后從頭計算投影和過濾的邏輯。這是為什么呢?究其緣由是,Cache Manager 要求兩個查詢的 Analyzed Logical Plan 必須完全一致,才能對 DataFrame 的緩存進行復用。
Analyzed Logical Plan 是比較初級的邏輯計劃,主要負責 AST 查詢語法樹的語義檢查,確保查詢中引用的表、列等元信息的有效性。像謂詞下推、列剪枝這些比較智能的推理,要等到制定 Optimized Logical Plan 才會生效。因此,即使是同一個查詢語句,僅僅是調換了select和filter的順序,在 Analyzed Logical Plan 階段也會被判定為不同的邏輯計劃。因此,為了避免因為 Analyzed Logical Plan 不一致造成的 Cache miss,我們應該采用第三種實現方式,把我們想要緩存的數據賦值給一個變量,凡是在這個變量之上的分析操作,都會完全復用緩存數據。
你看,緩存的使用可不僅僅是調用.cache那么簡單。除此之外,我們也應當及時清理用過的 Cache,盡早騰出內存空間供其他數據集消費,從而盡量避免 Eviction 的發生。一般來說,我們會用.unpersist 來清理棄用的緩存數據,它是.cache 的逆操作。unpersist 操作支持同步、異步兩種模式:

異步模式:調用 unpersist() 或是 unpersist(False)
同步模式:調用 unpersist(True)

在異步模式下,Driver 把清理緩存的請求發送給各個 Executors 之后,會立即返回,并且繼續執行用戶代碼,比如后續的任務調度、廣播變量創建等等。在同步模式下,Driver 發送完請求之后,會一直等待所有 Executors 給出明確的結果(緩存清除成功還是失敗)。各個 Executors 清除緩存的效率、進度各不相同,Driver 要等到最后一個 Executor 返回結果,才會繼續執行 Driver 側的代碼。
顯然,同步模式會影響 Driver 的工作效率。因此,通常來說,在需要主動清除 Cache 的時候,我們往往采用異步的調用方式,也就是調用 unpersist() 或是unpersist(False)。

總結

我們要掌握使用 Cache 的一般性原則和注意事項,我把它們總結為 3 條:

  • 如果 RDD/DataFrame/Dataset 在應用中的引用次數為 1,我們就堅決不使用 Cache
  • 如果引用次數大于 1,且運行成本占比超過 30%,我們就考慮啟用 Cache(其中,運行成本占比的計算,可以利用 Spark 3.0 推出的 noop 功能)
  • Action 算子要選擇 count 才能完全物化緩存數據,以及在調用 Cache 的時候,我們要把待緩存數據賦值給一個變量。這樣一來,只要是在這個變量之上的分析操作都會完全復用緩存數據。

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

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

相關文章

各維度卷積神經網絡內容收錄

各維度卷積神經網絡內容收錄 卷積神經網絡(CNN),通常是指用于圖像分類的2D CNN。但是,現實世界中還使用了其他兩種類型的卷積神經網絡,即1D CNN和3D CNN。 在1D CNN中,內核沿1個方向移動。1D CNN的輸入和…

高通Android 12 /13根據包名授權懸浮窗權限

代碼路徑frameworks/base/service/core/com/android/server/policy/PhoneWindowManager.java 1、 PhoneWindowManager.java中關于根據包名實現懸浮窗權限授權的功能實現 在實現根據包名授予懸浮窗權限的核心的功能開發中,在通過上述的功能原理實現的過程中分析得知…

EigenLayer 生態解析-再質押與 AVS 崛起

基于以太坊網絡的再質押協議 EigenLayer 提出了利用為以太坊網絡驗證而質押的 ETH 來與其他協議共享安全性和資本效率,同時為協議參與者提供額外利息。在 AVS、再質押、積分系統等概念的推動下,逐漸形成一個龐大的生態系統,從 2024 年初到現在 EigenLayer 的 TVL 增加了 12 …

5.Spring IOC 循環依賴問題源碼深度剖析

Spring IOC 容器解決循環依賴問題主要涉及到幾個關鍵的緩存和對象創建過程中的處理邏輯。以下是對循環依賴問題進行深度剖析的概述: 循環依賴的背景 循環依賴發生在兩個或多個Bean相互依賴對方,形成一個閉環。這可能是直接的,比如Bean A依賴B…

全球最大智能立體書庫|北京:3萬貨位,715萬冊,自動出庫、分揀、搬運

導語 大家好,我是社長,老K。專注分享智能制造和智能倉儲物流等內容。 新書《智能物流系統構成與技術實踐》 北京城市圖書館的立體書庫采用了先進的WMS(倉庫管理系統)和WCS(倉庫控制系統),與圖書…

Linux磁盤監控思路分析

磁盤監控原理 設備又名I/O設備,泛指計算機系統中除主機以外的所有外部設備。 1.1 計算機分類 1.1.1 按照信息傳輸速度分: 1.低速設備:每秒傳輸信息僅幾個字節或者百個字節,如:鍵盤、鼠標等 2.中速設備&#xff1a…

leetCode.98. 驗證二叉搜索樹

leetCode.98. 驗證二叉搜索樹 題目描述 代碼 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(n…

100張linux C/C++工程師面試高質量圖

文章目錄 雜項BIOSlinux開機啟動流程內核啟動流程網絡編程網絡編程流程tcp狀態機三次握手四次斷開reactor模型proactor模型select原理poll原理epoll原理文件系統虛擬文件系統文件系統調用阻塞IO非阻塞IO異步IO同步阻塞同步非阻塞IO多路復用進程管理進程狀態程序加載內存管理MMU…

力扣(2024.06.30)

1. 81——搜索旋轉排序數組2 已知存在一個按非降序排列的整數數組 nums &#xff0c;數組中的值不必互不相同。 在傳遞給函數之前&#xff0c;nums 在預先未知的某個下標 k&#xff08;0 < k < nums.length&#xff09;上進行了旋轉&#xff0c;使數組變為 [nums[k], n…

vue響應式原理細節分享

在講解之前&#xff0c;我們先了解一下數據響應式是什么&#xff1f;所謂數據響應式就是建立響應式數據與依賴&#xff08;調用了響應式數據的操作&#xff09;之間的關系&#xff0c;當響應式數據發生變化時&#xff0c;可以通知那些使用了這些響應式數據的依賴操作進行相關更…

前端:多服務端接口資源整合與zip打包下載

項目需求 前端項目開發中,有一個頁面需要去整合多個服務接口返回的數據資源,并且需要將這多個服務接口接口返回的數據進行資源壓縮,最終打包成zip壓縮包,并在客戶端完成下載。 基本需求梳理如下, 實現思路 這個需求點其實本質上還是傳統的“文件下載”功能需求,常見的例如…

Python使用defaultdict簡化值為list的字典

原始代碼&#xff1a; from typing import Dictrelated_objects_for_fetch: Dict[str, list] {}for key, value in [(k1, v1), (k1, v2), (k2, v2), (k3, v3), (k2, v2)]:if key not in related_objects_for_fetch:related_objects_for_fetch[key] []if value not in (value…

貪心問題(POJ1700/1017/1065)(C++)

一、貪心問題 貪心算法 貪心算法&#xff08;greedy algorithm&#xff09;&#xff0c;是用計算機來模擬一個「貪心」的人做出決策的過程。這個人十分貪婪&#xff0c;每一步行動總是按某種指標選取最優的操作。而且他目光短淺&#xff0c;總是只看眼前&#xff0c;并不考慮…

第三天:LINK3D核心原理講解【第1部分】

第三天:LINK3D核心原理講解 LINK3D學習筆記 目標 了解LINK3D velodyne64線激光雷達LINK3D質心點提取效果: 分布在車道與墻體的交界處。 課程內容 LINK3D論文精講LINK3D聚合關鍵點提取代碼講解LINK3D描述子匹配代碼講解除了ALOAM的線特征、面特征,還有其他點云特征嗎,是…

如何使用 Postgres 折疊您的堆棧 實現一切#postgresql認證

技術蔓延如何蔓延 假設您正在開發一款新產品或新功能。一開始&#xff0c;您的團隊會列出需要解決的技術問題。有些解決方案您將自行開發&#xff08;您的秘訣&#xff09;&#xff0c;而其他解決方案您將使用現有技術&#xff08;可能至少包括一個數據庫&#xff09;來解決。…

人工智能期末復習筆記(更新中)

分類問題 分類&#xff1a;根據已知樣本的某些特征&#xff0c;判斷一個新的樣本屬于哪種已知的樣本類 垃圾分類、圖像分類 怎么解決分類問題 分類和回歸的區別 1. 邏輯回歸分類 用于解決分類問題的一種模型。根據數據特征或屬性&#xff0c;計算其歸屬于某一類別 的概率P,…

ComfyUI局部重繪的四種方式 (附件工作流在最后)

前言 局部重繪需要在圖片中選擇重繪區域&#xff0c;點擊圖片右擊選擇Open in MaskEditor&#xff08;在蒙版編輯器中打開&#xff09;&#xff0c;用鼠標描繪出需要重繪的區域 方式一&#xff1a;重繪編碼器 這種方式重繪比較生硬&#xff0c;需要額外搭配使用才行 方式二&…

el-upload 上傳圖片及回顯照片和預覽圖片,文件流和http線上鏈接格式操作

<div v-for"(info, index) in zsjzqwhxqList.helicopterTourInfoList" :key"info.id" >編輯上傳圖片// oss返回線上地址http鏈接格式&#xff1a;<el-form-itemlabel"巡視結果照片":label-width"formLabelWidth"><el…

Cyber Weekly #13

賽博新聞 1、谷歌發布最強開源小模型Gemma-2 本周五&#xff08;6月28日&#xff09;凌晨&#xff0c;谷歌發布最強開源小模型Gemma-2&#xff0c;分別為9B&#xff08;90億&#xff09;和27B&#xff08;270億&#xff09;參數規模&#xff0c;其中9B 模型在多項基準測試中均…

潁川韓氏,來自戰國七雄韓國的豪族

潁川是戰國七雄韓國故土&#xff0c;韓國被秦國滅國后&#xff0c;王公貴族們除了堅決反秦的被殺了外&#xff0c;大部分都留存了下來。這些人在楚、漢反秦戰爭中&#xff0c;成為反秦統一戰線的重要力量&#xff0c;其中兩人先后被封為重新恢復的韓國的國王。 一個是橫陽君韓…