Spark學習筆記(四) Spark記憶體管理

2021-09-25 01:58:03 字數 2246 閱讀 3165

1.2 堆外記憶體

2.記憶體空間分配

3.儲存記憶體(storage)管理

主要需要學習的executor上面的記憶體管理

作為乙個jvm程序,executor的記憶體管理建立在jvm的記憶體管理之上,spark對jvm的堆內記憶體(on-heap)空間進行更詳細的分配,以充分利用記憶體空間。同時引入堆外內部,使spark可以直接申請工作節點中的系統記憶體進行使用。

堆內記憶體的大小取決於:

【注意】堆內記憶體共享jvm堆內記憶體,由jvm進行管理

堆內記憶體大致被劃分為三部分:申請

釋放

這裡需要另乙個題外話,jvm物件的序列化和反序列化

背景:jvm的物件可以進行序列化(將物件轉換為二進位制位元組流,可以簡單理解為由非連續的鏈式空間轉換為連續空間),而需要從位元組流轉換回物件則需要進行反序列化。==>序列化可以節省儲存空間,但是增加了序列化和反序列化的計算開銷。

導致問題:

為了進一步優化記憶體的使用以及提高shuffle時排序的效率,spark中引入了堆外(off-heap)記憶體,使spark可以直接工作節點的系統記憶體中開闢空間,儲存經過序列化的二進位制資料。

堆外記憶體可以被精準的申請和釋放(spark直接向作業系統申請,並有作業系統進行釋放)

[注]:預設情況下堆外記憶體並不啟用

儲存記憶體、執行記憶體和其他記憶體的大小在spark應用程式執行期間均為固定的。

rdd(其中的資料為多個partition)中的資料(原本是在other中)經過快取(cache、persist),這些資料被快取到storage模組中,並且是將離散的儲存轉換為連續的儲存,這個過程也稱為unroll

storage模組在邏輯上以block為基本儲存單位,rdd的每個partition經過處理後唯一對應乙個block

這裡記錄一下資料進行快取的幾個級別:

級別解釋

memory_only

只快取到記憶體中

memory_and_disk

先持久化到記憶體中,不夠用時再快取到磁碟中

memory_only_ser

序列化之後快取到記憶體中

memory_and_disk_ser

同memory_and_disk,但持久化的序列化後的資料

disk_only

只快取到磁碟中

memory_only_2/memory_and_disk_2

對持久化資料保留多乙個複製

rdd在快取到記憶體之前,partition中的資料一般以迭代器的資料結構進行訪問。通過iterator可以獲取分割槽中每一條序列化或者未序列化的資料項(record),這些record實際占用jvm堆內記憶體的other空間,同乙個partition的不同record的儲存空間不是連續的。

rdd快取到記憶體之後,partition被轉換成block。將partition由不連續的儲存空間轉換為連續儲存空間,此過程稱為unroll

由於同乙個executor的所有計算任務共享有限的儲存記憶體空間,當有新的block需要快取但是剩餘空間不足且無法動態占用時,就要對linkedhashmap中的就block進行淘汰(eviction),而被淘汰的block如果其儲存級別中同時包含儲存到磁碟的要求,則需要進行落盤(drop),否則直接刪除該block

Spark學習筆記(一) spark簡介

spark是基於記憶體計算的大資料平行計算框架。09年誕生於加州大學伯克利分校amplab.spark是mapreduce的替代方案,相容hdfs hive等分布式儲存層,可融入hadoop的生態系統,以彌補mapreduce的不足。其主要優勢如下 中間結果輸出 可以將多stage的任務串聯或者並行...

Spark學習筆記(四) Yarn模式

yarn執行模式就是說spark客戶端直接連線yarn,不需要額外構建spark集群。如果yarn是分布式部署的,那麼spark就跟隨它形成了分布式部署的效果。有yarn client和yarn cluster兩種模式,主要區別在於 driver程式的執行節點。其實簡單說來,就是用spark替換掉了...

spark 學習筆記

最近使用spark簡單的處理一些實際中的場景,感覺簡單實用,就記錄下來了。部門使用者業績表 1000w測試資料 使用者 部門 業績 資料載入 val context new sparkcontext conf var data context.textfile data.txt 場景1 求每個部門的...