spark shuffle寫操作——SortShuffleWriter


寫入的簡單流程:
1.生成ExternalSorter對象
2.將消息都是插入ExternalSorter對象中
3.獲取到mapOutputWriter,將中間產生的臨時文件合并到一個臨時文件
4.生成最后的data文件和index文件
可以看到寫入的重點類是ExternalSorter對象
image.png

ExternalSorter

基本功能:對(k,v)進行排序,中間可能存在合并操作,最后生成(k,c)。

  1. 使用partitioner對key進行分區
  2. 在每個分區中使用Comparator進行排序
  3. 輸出一個單獨的文件,每個分區對應這個文件中的一段范圍。

如果禁用了合并操作,類型C必須等于V
這個類的工作流程如下:

  • 使用數據,反復填充內存緩沖區。如果是可以合并的數據,則使用PartitionedAppendOnlyMap;如果不合并,則使用PartitionedPairBuffer。在這些緩沖區中,我們首先按分區ID對元素進行排序,然后可能還會按鍵進行排序。為了避免對每個鍵多次調用分區器,我們將分區ID與每條記錄一同存儲。
  • 當每個緩沖區達到內存限制時,會將其spill到文件中。這個文件首先按分區ID排序,如果需要做聚合操作,其次可能按鍵或鍵的哈希碼排序。對于每個文件,跟蹤每個分區在內存中的對象數量,因此不必為每個元素都寫出分區ID。
  • 當用戶請求迭代器或文件輸出時,溢寫的文件會與任何剩余的內存數據一起被合并,使用上述定義的相同排序順序(除非排序和聚合都被禁用)。如果需要按鍵進行聚合,我們或者從ordering參數中使用全序,或者讀取具有相同哈希碼的鍵并相互比較它們的相等性來合并值。
  • 用戶在結束時應調用stop()方法來刪除所有中間文件。

緩存buffer:PartitionedAppendOnlyMap、PartitionedPairBuffer
關鍵方法:insertAll、maybeSpillCollection、spill、writePartitionedMapOutput
image.png
image.png

PartitionedPairBuffer

capacity 容量
curSize 當前放入的數據量
data 數組,存儲的數據,(k,v)占用數組的兩個位置
image.png

insert

如果容量達到瓶頸就進行擴容。
先存key,再存value。再調用afterUpdate
image.png

afterUpdate

numUpdates數據插入/更新次數
nextSampleNum下一次采樣的次數
更新numUpdates,如果達到采樣次數,執行采樣takeSample
image.png

takeSample

samples中只存兩個樣品數據,用來計算每次更新的差值。
采樣的時候要移除多余的數據。更新下一次采樣的數據量。
image.png

estimateSize

預估大小。
最后一個樣品的lastSize+bytesPerUpdate*新增的更新次數。
image.png

resetSamples

重新進行采樣。
image.png

growArray

擴容2倍容量,遷移數據,重啟采樣
image.png

partitionedDestructiveSortedIterator

生成比較器comparator,調用sort對緩存的數據進行排序。
image.png
sorter是使用TimSort進行排序的。
TimSort介紹: https://zhuanlan.zhihu.com/p/695042849
image.png

iterator

用pos計算剩余量。
data(2 * pos)為key,data(2 * pos+1) 為value
image.png

PartitionedAppendOnlyMap

存儲數據用的數組data,里面的元素是key0, value0, key1, value1, key2, value2…
image.png

changeValue

PartitionedAppendOnlyMap插入數據不再是追加,而是有一個相同key合并值的過程。

  1. key是null,返回null,不進行存儲
  2. key首次插入,更新data中的對應的kv值
  3. key非首次插入,更新data中合并的的新value
  4. key發生哈希沖突,就向后加1,直到不沖突

image.png

update

跟changeValue類似。
image.png

growTable

比較簡單,就是容量擴大兩倍,將舊的kv值重新計算hash插入到新的數組中,如果發生hash沖突就不斷向后移動一位。
image.png

iterator

核心方法是nextValue,在nextValue中,遍歷data數組的對應key值,要求不是null,表明這個位置是有值的。
如果有key為null,要求pos=-1且haveNullValue=true
image.png

partitionedDestructiveSortedIterator

調用destructiveSortedIterator方法
image.png

destructiveSortedIterator

data數組中元素是分散的,首先將數組中的元素都集中到數組的前面。后面就跟PartitionedPairBuffer的partitionedDestructiveSortedIterator方法一樣使用TimeSort進行排序。
image.png

采樣相關方法

跟上面的PartitionedPairBuffer的采樣相關方法一樣。

spill相關方法

入口方法是maybeSpillCollection
image.png

maybeSpillCollection

不論使用的數據結構是buffer還是map,都是計算消耗的容量,再調用maybeSpill方法,最后重新初始化化對應數據結構。可以想到maybeSpill中就將緩存的數據放到了本地。
image.png

maybeSpill

每32條數據就進行一次內存使用情況判斷。如果當前使用內存超過了限制,就先申請新的內存,按照兩倍的內存使用量申請,不一定申請到足量的內存。申請后還是內存使用超過了限制,就進行spill,調用spill方法,同時調用releaseMemory釋放內存。
image.png

releaseMemory

image.png

spill

調用destructiveSortedWritablePartitionedIterator方法返回排好序的分區迭代器。
調用spillMemoryIteratorToDisk將數據溢寫到磁盤上
最后將生成的文件記錄到spills中
image.png

destructiveSortedWritablePartitionedIterator

調用對應數據結構的partitionedDestructiveSortedIterator方法返回排序的迭代器。
就是上面的PartitionedPairBuffer和PartitionedAppendOnlyMap的partitionedDestructiveSortedIterator方法。
image.png

spillMemoryIteratorToDisk

創建臨時文件,生成對應的writer
image.png
遍歷將數據寫入的文件中,每10000條進行一次flush。
如果失敗了,調用revertPartialWritesAndClose進行回滾。
image.png

revertPartialWritesAndClose

如果這次寫入出現問題,使用這個方法。回滾寫入,只保留截止到上一次寫入的內容。
image.png

writePartitionedMapOutput

將排好序的緩存和文件合并成一個文件輸出。
spills為空,即沒有產生排序文件。將緩存中數據生成排好序的迭代器,遍歷寫入到文件中。
image.png
存在排好序的文件。則需要調用partitionedIterator方法將文件數據和緩存的數據進行合并,再遍歷輸出。
image.png

partitionedIterator

調用merge方法合并內存和文件數據
image.png

merge

merge的第一個參數是spilled文件,第二個參數是內存緩存的數據。
流程是遍歷分區,取出對應分區的spilled文件中和緩存中的數據。
根據情況進行聚合或者排序等操作后輸出合并后的排好序的文件。
image.png

mergeSort

使用堆排序,但是heap中存放的是已經排好序的iterator。
最小值就是heap中首個iterator中的第一個元素。
image.png

mergeWithAggregation

有總排序,這樣相同的key會在一起。
調用mergeSort將iterators合并成一個排好序的iterator。
next方法就是遍歷key出來全部的值,進行合并后輸出,因為是全局有序,不需要遍歷iterator全部數據。
image.png
沒有總排序
跟上面流程類似,先得到合并的iterator,但是它不是全局有序的。存在不同的key在comparator比較下相等,如使用hash進行比較,因此存在 aaabaaa 這種情況的key分布。
在獲取相同key對應的值的時候需要遍歷iterator的使用comparator和equal進行比較數據,再進行合并。返回值是一個comparator相同有可能key不同的key組成的iterator
image.png

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

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

相關文章

Vant Ui 最新訪問地址

Vant 4 - A lightweight, customizable Vue UI library for mobile web apps. 順帶一個頂部導航欄正常寫法 先使用吸頂為0&#xff0c;然后再寫nav-bar <van-sticky :offset-top"0"> <van-nav-bar class"top-title" title"村集體土地公示&q…

對為什么react需要時間分片,vue3不需要的淺學習

1、時間分片 時間分片指在讓應用在cpu進行大量計算時也能與用戶交互&#xff0c;但時間分片只能對大量cpu計算進行優化&#xff0c;無法優化復雜DOM操作&#xff0c;因為要確保用戶正在操作的界面是最新。 web卡頓的場景&#xff1a; 1、cpu計算量不大&#xff0c;但dom操作…

人工智能算法工程師(中級)課程1-Opencv視覺處理之基本操作與代碼詳解

大家好&#xff0c;我是微學AI&#xff0c;今天給大家介紹一下人工智能算法工程師(中級)課程1-Opencv視覺處理之基本操作與代碼詳解。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫。它提供了各種視覺處理函數&am…

Redis為什么變慢了?一文講透如何排查Redis性能問題

Redis 作為優秀的內存數據庫&#xff0c;其擁有非常高的性能&#xff0c;單個實例的 OPS 能夠達到 10W 左右。但也正因此如此&#xff0c;當我們在使用 Redis 時&#xff0c;如果發現操作延遲變大的情況&#xff0c;就會與我們的預期不符。 你也許或多或少地&#xff0c;也遇到…

以太網中的各種幀結構

幀結構&#xff08;Ethernet Frame Structure&#xff09;介紹 以太網信號幀結構&#xff08;Ethernet Signal Frame Structure&#xff09;&#xff0c;有被稱為以太網幀結構&#xff0c;一般可以分為兩類 —— 數據幀和管理幀。 按照 IEEE 802.3&#xff0c;ISO/IEC8803-3 …

短視頻矩陣管理系統:如何提升內容質量,幫助企業獲客?

在數字化營銷蓬勃發展的今天&#xff0c;短視頻已成為企業推廣的重要陣地。然而&#xff0c;如何高效管理短視頻內容&#xff0c;提升內容質量&#xff0c;進而幫助企業精準獲客&#xff0c;成為企業亟待解決的問題。短視頻矩陣管理系統應運而生&#xff0c;以其強大的功能和靈…

TCP/IP協議超時重傳,以及應用層超時重傳一文詳解

很多人會有這樣的疑問 TCP/IP協議內置了超時重傳的功能&#xff0c;那為什么連接完全斷開或超時時&#xff0c;應用層代碼段還會進行重傳處理呢&#xff1f; TCP協議的重傳機制 客戶端 服務器| ||---- 數據段1 --…

編程范式之并發編程

目錄 前言1. 并發編程的定義2. 并發編程的特點2.1 任務交替執行2.2 狀態共享與同步2.3 并行執行 3. 并發編程的適用場景3.1 高性能計算3.2 I/O 密集型應用3.3 實時系統 4. 并發編程的優點4.1 提高資源利用率4.2 縮短響應時間4.3 提高系統吞吐量 5. 并發編程的缺點5.1 編程復雜性…

硬盤模式vmd怎么改ahci_電腦vmd改ahci模式詳細步驟

最近有很多網友問&#xff0c;我新買的電腦安裝原版win10或win11找不到驅動器呀&#xff0c;進入第三方pe又找不到硬盤&#xff0c;找到硬盤安裝后又出現安裝藍屏的情況&#xff0c;新機器怎么回事呀&#xff1f;這位網友內心有點崩潰&#xff0c;不知道啥原因。其實這些都是由…

初識c++(類與對象——上)

一、類的定義 1、類定義格式 ? class為定義類的關鍵字&#xff0c;Stack為類的名字&#xff0c;{}中為類的主體&#xff0c;注意類定義結束時后面分號不能省 略。類體中內容稱為類的成員&#xff1a;類中的變量稱為類的屬性或成員變量; 類中的函數稱為類的方法或 者成員函…

損失函數 - Transformer教程

在人工智能和深度學習的領域&#xff0c;Transformer模型已經成為了非常流行的選擇。而在Transformer模型的訓練過程中&#xff0c;損失函數扮演了至關重要的角色。今天&#xff0c;我們就來深入探討一下什么是損失函數&#xff0c;以及它在Transformer中的應用。 什么是損失函…

【Node.js安裝教程】

Node.js安裝教程 第一步&#xff1a;下載 下載鏈接&#xff1a;https://nodejs.org/zh-cn 第二步&#xff1a;安裝 **方法一&#xff1a;**建議安裝在默認路徑 方法二&#xff1a;如果不是默認安裝路徑可能會出現一系列問題&#xff1a;這時可以選擇卸載重裝或者配置環境變量…

kotlin數據類型

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 Kotlin基本數值類型 基本數據類型包括 Byte、Short、Int、Long、Float、Double 整數類型 類型位寬最小值最大…

安卓微信8.0之后如何利用緩存找回的三天之前不可見的朋友圈圖片

安卓微信8.0之后如何利用緩存找回的三天之前不可見的朋友圈圖片 復習了下安卓程序的知識&#xff0c;我們會了解到&#xff0c;安卓程序清楚數據的時候有兩個選項 一個是清除全部數據一個是清除緩存。 清除全部數據表示清除應用數據緩存。 對于安卓微信8.0之后而言&#xff0…

OTP防重放攻擊

OTP本意是一次性口令&#xff0c;比如郵箱驗證碼&#xff0c;短信驗證碼&#xff0c;或者根據totp或者hotp生成的默認30秒一變的6位數字。 不過開發者要注意&#xff0c;必須要在驗證成功后失效那個驗證碼&#xff0c;不然就會導致重放攻擊。 對于郵箱驗證碼&#xff0c;服務器…

徹底開源,免費商用,上海AI實驗室把大模型門檻打下來

終于&#xff0c;業內迎來了首個全鏈條大模型開源體系。 大模型領域&#xff0c;有人探索前沿技術&#xff0c;有人在加速落地&#xff0c;也有人正在推動整個社區進步。 就在近日&#xff0c;AI 社區迎來首個統一的全鏈條貫穿的大模型開源體系。 雖然社區有LLaMA等影響力較大…

從 ArcMap 遷移到 ArcGIS Pro

許多 ArcMap 用戶正在因 ArcGIS Pro 所具有的現代 GIS 桌面工作流優勢而向其遷移。 ArcGIS Pro 與其余 ArcGIS 平臺緊密集成&#xff0c;使您可以更有效地共享和使用內容。 它還將 2D 和 3D 組合到一個應用程序中&#xff0c;使您可以在同一工程中使用多個地圖和多個布局。 Arc…

【C++雜貨鋪】C++11新特性

目錄 &#x1f308; 前言&#x1f308; &#x1f4c1; C11介紹 &#x1f4c1; 統一初始化列表 &#x1f4c1; 聲明 &#x1f4c2; auto &#x1f4c2; decltype &#x1f4c2; 返回類型后置 &#x1f4c2; 范圍for &#x1f4c2; 模板別名 &#x1f4c2; nullptr &#x1…

服務器使用PC作為代理訪問外網

1、PC上啟動代理&#xff0c;比如nginx 下載nginx&#xff1a;http://nginx.org/en/download.html 修改配置文件&#xff0c;在conf下&#xff1a; http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server…

六、 SpringBoot 配置?件 ★ ?

六、 SpringBoot 配置?件 本節?標1. 配置?件作?2. 配置?件快速??3. 配置?件的格式4. properties 配置?件說明4.1 properties 基本語法4.2 讀取配置?件4.3 properties 缺點分析 5. yml 配置?件說明5.1 yml 基本語法5.2 yml 使?進階5.2.1 yml 配置不同數據類型及 nul…