Executor記憶體管理以及shuffle的調優

2021-09-01 00:10:03 字數 3017 閱讀 9681

1.在spark記憶體管理分為兩種:靜態的記憶體管理統一的記憶體管理

對storage對應的60%再進行細分:

對storage對應的60%的90%進行細分:

與靜態的記憶體管理相比:

使用者干預比較少(供設定的配置檔案比較少),主要是內部自動調節

統一管理相比靜態管理的獨特之處:

預設值:32k

引數說明:該引數用於設定shuffle write task的bufferedoutputstream的buffer緩衝大小。將資料寫到磁碟檔案之前,會先寫入buffer緩衝中,待緩衝寫滿之後,才會溢寫到磁碟。

調優建議:如果作業可用的記憶體資源較為充足的話,可以適當增加這個引數的大小(比如64k),從而減少shuffle write過程中溢寫磁碟檔案的次數,也就可以減少磁碟io次數,進而提公升效能。在實踐中發現,合理調節該引數,效能會有1%~5%的提公升。

spark.reducer.maxsizeinflight

預設值:48m

引數說明:該引數用於設定shuffle read task的buffer緩衝大小,而這個buffer緩衝決定了每次能夠拉取多少資料。

調優建議:如果作業可用的記憶體資源較為充足的話,可以適當增加這個引數的大小(比如96m),從而減少拉取資料的次數,也就可以減少網路傳輸的次數,進而提公升效能。在實踐中發現,合理調節該引數,效能會有1%~5%的提公升。

spark.shuffle.io.maxretries

預設值:

引數說明:shuffle read task從shuffle write task所在節點拉取屬於自己的資料時,如果因為網路異常導致拉取失敗,是會自動進行重試的。該引數就代表了可以重試的最大次數。如果在指定次數之內拉取還是沒有成功,就可能會導致作業執行失敗。

調優建議:對於那些包含了特別耗時的shuffle操作的作業,建議增加重試最大次數(比如60次),以避免由於jvm的full gc或者網路不穩定等因素導致的資料拉取失敗。在實踐中發現,對於針對超大資料量(數十億~上百億)的shuffle過程,調節該引數可以大幅度提公升穩定性。

shuffle file not find taskscheduler不負責重試task,由dagscheduler負責重試stage

spark.shuffle.io.retrywait

預設值:5s

引數說明:具體解釋同上,該引數代表了每次重試拉取資料的等待間隔,預設是5s。

調優建議:建議加大間隔時長(比如60s),以增加shuffle操作的穩定性。

spark.shuffle.memoryfraction

預設值:0.2

引數說明:該引數代表了executor記憶體中,分配給shuffle read task進行聚合操作的記憶體比例,預設是20%。

調優建議:在資源引數調優中講解過這個引數。如果記憶體充足,而且很少使用持久化操作,建議調高這個比例,給shuffle read的聚合操作更多記憶體,以避免由於記憶體不足導致聚合過程中頻繁讀寫磁碟。在實踐中發現,合理調節該引數可以將效能提公升10%左右。

spark.shuffle.manager

預設值:sort

引數說明:該引數用於設定shufflemanager的型別。spark 1.5以後,有三個可選項:hash、sort和tungsten-sort。hashshufflemanager是spark 1.2以前的預設選項,但是spark 1.2以及之後的版本預設都是sortshufflemanager了。tungsten-sort與sort類似,但是使用了tungsten計畫中的堆外記憶體管理機制,記憶體使用效率更高。

調優建議:由於sortshufflemanager缺省會對資料進行排序,因此如果你的業務邏輯中需要該排序機制的話,則使用預設的sortshufflemanager就可以;而如果你的業務邏輯不需要對資料進行排序,那麼建議參考後面的幾個引數調優,通過bypass機制或優化的hashshufflemanager來避免排序操作,同時提供較好的磁碟讀寫效能。這裡要注意的是,tungsten-sort要慎用,因為之前發現了一些相應的bug。

spark.shuffle.sort.bypassmergethreshold

預設值:200

引數說明:當shufflemanager為sortshufflemanager時,如果shuffle read task的數量小於這個閾值(預設是200),則shuffle write過程中不會進行排序操作,而是直接按照未經優化的hashshufflemanager的方式去寫資料,但是最後會將每個task產生的所有臨時磁碟檔案都合併成乙個檔案,並會建立單獨的索引檔案。

調優建議:當你使用sortshufflemanager時,如果的確不需要排序操作,那麼建議將這個引數調大一些,大於shuffle read task的數量。那麼此時就會自動啟用bypass機制,map-side就不會進行排序了,減少了排序的效能開銷。但是這種方式下,依然會產生大量的磁碟檔案,因此shuffle write效能有待提高。

1、**不規範。。。

三種解決方案:

1、提高executor的記憶體

2、提高shuffle聚合的記憶體比例

3、減少每次拉去的資料量

記憶體管理以及分配

前面有型別的 叫定義 前面無型別的 叫使用 alloc 開闢空間,並且把空間清零 init 初始化 為0 一.棧區 凡是 在函式體內 和 方法體內 定義 的變數 都儲存在棧區 包括形參 棧的特點是 先進後出 先定義的變數 先入棧 後定義的變數後入棧 呼叫函式時 函式中的變數會陸續入棧 函式呼叫結束時...

Memcached工作原理以及記憶體管理

memcached工作原理 包括服務端和客戶端,以鍵值對的形式儲存。key根據乙個 hash 演算法得到乙個 hashkey 根據這個值來確定選擇哪台伺服器儲存。客戶端根據 key的值用相同的方法計算出 hash 值,確定是哪個伺服器,然後進行連線,獲取 value值 快取策略 當服務端的hash ...

C以及C 的記憶體管理分析以及比較

首先看下面這個 int a 1 void test 對於c語言的學習,我們不難看出,a,b在資料段,num,p,ptr在棧,p在堆上,ptr在 段。因此,可以做如下總結。1.棧又叫堆疊,非靜態區域性變數 函式引數 返回值等等,棧是向下增長的。2.記憶體對映段是高效的i o對映方式,用於裝載乙個共享的...