【Spark篇】---Spark中Shuffle文件的尋址
一、前述
Spark中Shuffle文件的尋址是一個文件底層的管理機制,所以還是有必要了解一下的。
二、架構圖
三、基本概念:
1) MapOutputTracker
MapOutputTracker是Spark架構中的一個模塊,是一個主從架構。管理磁盤小文件的地址。
- MapOutputTrackerMaster是主對象,存在於Driver中。
- MapOutputTrackerWorker是從對象,存在於Excutor中。
2) BlockManager
BlockManager塊管理者,是Spark架構中的一個模塊,也是一個主從架構。
- BlockManagerMaster,主對象,存在於
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內存。
【Spark篇】---Spark中Shuffle文件的尋址