Spark存儲體系

Spark存儲體系

無論是spark的任務提交還是,任務執行,在這過程中始終離不開spark的存儲體系。spark爲了避免hadoop讀寫磁盤的IO操作成爲性能瓶頸,優先將配置信息、計算結果等數據存入內存,當內存存儲不下的時候,可選擇性的將計算結果輸出到磁盤,爲了保證性能,默認都是存儲到內存的,這樣極大的提高了spark的計算效率。存儲體系中核心模塊就是bolckmanager。在blockmanager中中要是由以下幾部分分組成:

  • shuffle 客戶端shuffleclient;
  • BlockManagerMaster(對存於所有Exector上的BolckManager統一管理);
  • 磁盤塊管理器DiskBlockManager;
  • 內存存儲MemoryStore;
  • 磁盤存儲DiskStore;
  • Tachyon存儲TachyonStore

spark 存儲體系架構

spark存儲架構圖如下:

這裏寫圖片描述

  • 1表示Executor的BlockManager與Driver的BlockManager進行消息通信,例如註冊BlockManager、更新Block信息、獲取Block所在的BlockManager、刪除Executor等。
  • 2表示對BlockManager的讀操作如get、doGetLocal等和寫操作doPut、puSingle等。
  • 3表示當MemoryStore的內存不足時,寫入DiskStore,而DiskStore實際依賴於DiskBlockManager。
  • 4表示通過訪問遠端節點的Executor的BlockManager中的TransportServer提供RPC服務下上傳Block。
  • 5表示遠端節點的Executor的BlockManager訪問本地Executor的BlockManager中的TransportServer提供的RPC服務下載Block。

shuffle服務與客戶端

Block的RPC服務

當map任務與reduce處於不同的節點時,reduce任務需要從遠端節點下載map任務的中間輸出,因此NettyBlockRpc Server提供打開,即下載block的功能;在一些情況下,爲了容錯,需要將Block備份到其他節點,NettyBlockRpcServer還提供上傳Block文件的Rpc服務;

構造傳輸上下文TransportContext

TransportContext既可以創建Netty服務,也可以創建Netty訪問客戶端,組成部分如下:
1)TransportConf:主要控制Netty框架提供的shuffle的I/O交互的客戶端和服務端線程數量等;
2)RpcHandler:負責shuffle的I/O服務端在接收到客戶端的RPC請求後,提供打開Block或者上傳Block的RPC處理,此處實現爲NettyBlockRpcServer;
3)是否關閉閒置連接

獲取遠程shuffle文件

NettyBlockTransferService的fetchBlocks方法用於獲取遠程的shuffle文件,實際是使用NettyBlockTransferService中創建的Netty服務。通過Netty服務獲取遠程Block.

上傳shuffle文件

NettyBlockTransferService的uploadBlock方法用於上傳shuffle文件到遠程的Executor,實際也是用NettyBlockTransferService中創建的Netty服務,步驟如下:
1)創建Netty服務的客戶端,客戶端連接的hostname和port正是BlockManager的hostname和port
2)將Block的存儲級別StorageLevel和類標籤序列化
3)將Block的ByteBuffer轉化爲數據,便於序列化
4)將appId、execId、blockId、metadata、轉化爲數組的Block封裝爲UploadBlock,並將其序列化爲字節數組
5)最終調用Netty客戶端的sendRpc方法將字節數組上傳,回掉函數RpcResponseCallback根據RPC的結果更改上傳狀態。


BlockManagerMaster

BlockManagerMaster 是Driver的DAGSchduler中的一個重要對象,其功能就是負責對各個節點的BlockManager內部管理的元數據,進行管理與維護,如block的增刪等操作,都會在這裏維護變化的操作。
每個worker中的BlockManager在創建後,首先要做的事情就是向Driver中的BlockManagerMaster進行註冊。此時BlockManagerMaster內部就會爲這個BlockManager建立一個對應的BlockManagerInfo。
每個BlockManager包含四個部分:DiskStore,MemoryStore,ConnectionManager(負責建立BlockManager到遠程其他BlockManager的網絡連接),BlockManagerWorker 負責對遠程其他節點上BlockManager的數據的讀寫。

BlockStore

BlockStore是spark中的一個抽象類,在這個類中定義了一系列的存儲規範,DiskStore(磁盤級別的持久化)、MemoryStore(內存級別的持久化)和TachyonStore(Tachyon內存分佈式文件系統級別的持久化)。其繼承類圖如下:

這裏寫圖片描述

內存存儲MemoryStore

MemoryStore負責將沒有序列化的java對象數組或者序列化後的ByteBuffer存儲到內存中。整個MemoryStore分爲兩塊:一塊是很多MemoryEntry佔據的內存currentMemory,這些MemoryEntry通常是通過entries持有的;另一塊就是unrollMemoryMap通過佔座的方式佔用內存的current-UnrollMemory。unrollMemoryMap可以保證在向內存寫入數據時不會發生溢出。
MemoryStory繼承自BlockStore,並實現了getBytes,putArray,putIteratorI,getValues等方法。

磁盤存儲DiskStore

DiskStore通過DiskBlockManager來實現Block和相應磁盤文件的映射關係,從而將Block存儲到磁盤的文件中。DiskBlockManager根據YARN_LOCAL_DIRS或LOCAL_DIRS(yarn模式),SPARK_LOCAL_DIRS或spark.local.dir(其他模式,默認值System.getProperty(“java.io.tmpdir“))配置的本地根目錄(可能有多個,以逗號分隔)來生成DiskStore存放Block的根目錄(與配置的根目錄對應,也有可能有多個):…/blockmgr-UUID.randomUUID.toString(yarn模式)或…/spark-UUID.randomUUID.toString/blockmgr-UUID.randomUUID.toString(其他模式)。同時DiskBlockManager會爲每個根目錄生成conf.getInt(“spark.diskStore.subDirectories“, 64)個子目錄用來存放Block對應的文件,每個Block會根據它的name哈希到相應的子目錄,然後以Block的name爲文件名來生成文件存儲。

Tachyon存儲TachyonStore

TaychyonStore是以內存爲中心的高容錯的分佈式文件系統,能夠爲集羣框架提供可靠的內存級文件共享的服務。TachyonStore是一個分佈式文件系統。
Tachyon也採用Master-Worker的架構,Tachyon Master支持ZooKeeper進行容錯,用於管理全部文件的元數據信息,同時也監控各個Tachyon Worker的狀態。每個Tachyon Worker啓動一個守護進程,管理本地的Ramdisk,Ramdisk中存儲了具體的文件數據,Ramdisk實際是Tachyon集羣的內存部分。
Tachyon採用與sparkRdd 相類似的方法,它利用lineage信息和異步記錄下來的checkpoint來恢復數據,所以Tachyon是可靠的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章