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 求每個部門的...