Spark IO機制

airland發表於2021-09-09

Spark進行IO不僅考慮本地開銷,還有資料在不同主機之間的開銷,同時對資料的定址方式也要改變,以應對大資料

序列化
- 用於程式間通訊,不同節點之間資料傳輸
- 用於持久化儲存到磁碟,序列化速度影響叢集總體效率
在預設情況下,Spark採用Java的ObjectOutputStream序列化一個物件。該方式適用於所有實現了java.io.Serializable的類。Java序列化非常靈活,但是速度較慢。Spark也能使用Kryo序列化物件。Kryo不但速度極快,而且產生的結果更為緊湊(通常能提高10倍)。Kryo的缺點是不支援所有型別

壓縮
- 序列化後的資料進行壓縮,減少空間開銷
- 大片連續區域進行資料儲存並且儲存區域中資料重複性高的狀況下,資料適合進行壓縮節省空間
Spark採用兩種壓縮演算法,snappy和LZF,可以自定義壓縮庫
Snappy壓縮速度更快,LZF壓縮比更高

塊管理
RDD邏輯上按照Partition分塊,RDD可以看作是一個分割槽作為資料項的分散式陣列,物理上儲存單位是Block,一個Partition對應一個Block,partitionId透過後設資料對映到物理Block

整體IO管理分為兩個層次
通訊層:IO模組採用Master-Slave結構實現通訊層的架構
儲存層:Spark塊資料需要儲存到記憶體或者磁碟

BlockManager中的通訊
主節點和從節點之間透過Actor傳送訊息傳遞命令和狀態

圖片描述

資料讀寫

資料寫入:
1.RDD呼叫compute()方法進行制定分割槽的寫入。
2.CacheManager中呼叫BlockManager判斷資料是否已經寫入,如果未寫入則寫入。
3.BlockManager中資料與其他節點同步。
4.BlockManager根據儲存級別寫入制定的儲存層。
5.BlockManager向主節點彙報儲存狀態。

資料讀取:
在RDD類中,透過compute方法呼叫iterator讀寫某個分割槽(Partition),作為資料讀取的入口。分割槽是邏輯概念,在物理上是一個Block。

透過BlockManager讀取程式碼進入讀取邏輯,在本地同步讀取資料塊,首先看能否在記憶體讀取資料塊,如果不能讀取,則看能否從Tacjyon讀取資料塊,如果仍不能讀取,則看能否從本地磁碟讀取資料。如果仍不存在,再看看網路中其它節點是否有資料。

圖片描述



作者:Alex90
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2819253/,如需轉載,請註明出處,否則將追究法律責任。

相關文章