1.Spark Shuffle文件寻址
- MapOutputTracker(管理磁盘小文件)
主从关系:
MapOutputTrackerMaster(Driver)
MapOutputTrackerWorker(Executor) - BlockManager(块管理者)
主从关系:
BlockManagerMaster(Driver)
1.DiskStore:管理磁盘数据
2.MemoryStore:管理内存数据
3.ConnectionManager:负责连接其他的BlockManager
4. BlockTransferService:负责拉取数据
BlockManagerWorker(Executor)
1.DiskStore:管理磁盘数据
2.MemoryStore:管理内存数据
3.ConnectionManager:负责连接其他的BlockManager
4.BlockTransferService:负责拉取数据
寻址图解
流程解读:
1. map task处理完数据之后,将数据结果和落地磁盘的位置封装到MapStatus对象中,通过Executor中的MapOutputTrackerWorker汇报给Driver中的MapOutputTrackerMaster,这样Driver就掌握了磁盘小文件的位置。
2. reduce task拉取数据之前会通过Executor中的MapOutputTrackerWorker向Driver中的MapOutputTrackerMaster请求磁盘小文件的位置,然后MapOutputTrackerMaster返回磁盘小文件的位置
**3.**拿到磁盘小文件的位置后,Executor中的BlockManagerWorker下的ConnectionManager去连接磁盘小文件所在的节点的BlockManagerWorker
注:BlockManagerMaster和BlockManagerWorker也有通信联系,当使用持久化算子cache时是在Driver执行的,但cache实际要处理的数据在Executor端,这时需要BlockManagerMaster去和BlockManagerWorker通信。
4. 连接成功后,Executor中的BlockManagerWorker下的BlockTransferService默认启动5个子线程拉取数据,默认这5个task一次拉取的数据量不能超过48M
注:BlockTransferService拉取来的数据放在shuffle聚合内存中,当第一次拉取来的数据量大于shuffle聚合内存大小时会出现OOM,且当shuffle聚合内存大小大于第一次拉取来的数据量但不足于存储下一次拉取来的数据时,会发生移写磁盘,这样会降低reduce聚合时的效率。
如何解决reduce端 OOM的问题?
①减少BlockTransferService拉取数据的量
②增大Executor总体内存(shuffle聚合内存spark.shuffle.memoryFraction 占Executor总体内存的0.2 )
③增加shuffle内存的比例
2.内存管理
Spark在Spark1.6之前使用的是静态内存管理,spark1.6之后使用的是统一内存管理,spark.memory.useLegacyMode false(统一内存管理)
-
静态内存管理
-
统一内存管理