一、前述
Spark中Shuffle檔案的定址是一個檔案底層的管理機制,所以還是有必要了解一下的。
二、架構圖
三、基本概念:
1) MapOutputTracker
MapOutputTracker是Spark架構中的一個模組,是一個主從架構。管理磁碟小檔案的地址。
- MapOutputTrackerMaster是主物件,存在於Driver中。
- MapOutputTrackerWorker是從物件,存在於Excutor中。
2) BlockManager
BlockManager塊管理者,是Spark架構中的一個模組,也是一個主從架構。
- BlockManagerMaster,主物件,存在於Driver中。
BlockManagerMaster會在叢集中有用到廣播變數和快取資料或者刪除快取資料的時候,通知BlockManagerSlave傳輸或者刪除資料。
- BlockManagerWorker,從物件,存在於Excutor中。
BlockManagerWorker會與BlockManagerWorker之間通訊。
無論在Driver端的BlockManager還是在Excutor端的BlockManager都含有四個物件:
① DiskStore:負責磁碟的管理。
② MemoryStore:負責記憶體的管理。
③ ConnectionManager:負責連線其他的 BlockManagerWorker。
④ BlockTransferService:負責資料的傳輸。
四、Shuffle檔案定址流程
a) 當map task執行完成後,會將task的執行情況和磁碟小檔案的地址封裝到MpStatus物件中,通過MapOutputTrackerWorker物件向Driver中的MapOutputTrackerMaster彙報。
b) 在所有的map task執行完畢後,Driver中就掌握了所有的磁碟小檔案的地址。
c) 在reduce task執行之前,會通過Excutor中MapOutPutTrackerWorker向Driver端的MapOutputTrackerMaster獲取磁碟小檔案的地址。
d) 獲取到磁碟小檔案的地址後,會通過BlockManager中的ConnectionManager連線資料所在節點上的ConnectionManager,然後通過BlockTransferService進行資料的傳輸。
e) BlockTransferService預設啟動5個task去節點拉取資料。預設情況下,5個task拉取資料量不能超過48M。拉取過來的資料放在Executor端的shuffle聚合記憶體中(spark.shuffle.memeoryFraction 0.2), 如果5個task一次拉取的資料放不到shuffle記憶體中會有OOM,如果放下一次,不會有OOM,以後放不下的會放磁碟。
五、擴充套件補充如何避免OOM
1、拉去資料 少一些。
2、提高ExecutorShuffle聚合記憶體。
3、提高executor記憶體。