spark的shuffle过程

上一篇写了shuffle的几种机制, 这一篇就介绍一下shuffle拉去数据的过程和executor的内存管理
1、map task处理完数据溢写到本地磁盘后,会将数据结果和落地磁盘文件的位置封装成MapStatus对象中,通过MapoutputTrackerWorker会向Driver端的MapoutputTrackerMaster,Driver端就掌握了磁盘小文件的位置。
2、reduce task拉去数据,会向本地的MapOutputTrackerWork要数据,还会(谁向)向Driver中的MapoutputTrakerMaster要磁盘小文件的位置,MapOutputTrackerMaster返回磁盘小文件的位置(MapStatus)

3、获取小文件的位置后,BlockManagerWork会通过ConnectionManager连接磁盘小文件所在的BlockManagerWork

4、连接上后会开启线程拉去磁盘小文件,放在executor中的内存中, BlockTransferService默认启动5个子线程拉去数据,默认这个线程一次拉去的数据不能超过48M

5、BlockManagerMaster向BlockManagerWord通信是在比如说cache,还有广播变量时,cache在Driver端,通过两者进行通信cache

reduce端拉去的数据存储在executor的shuffle.memory中(占executor的内存的0.2), reduce端拉去数据时默认一次最多拉去的数据时48M,如果shuffle.memory是50M ,第一次拉去数据是48M 剩余2M,第二次拉去是30M, 不会出现内存溢出,会溢写磁盘。 但是如果shuffle.memory的内存是30M,第一次拉去48M,那么就会出现OOM内存溢出, 只要第一拉去不会内存溢出,以后都不会出现内存溢出

在这里插入图片描述

内存管理
Spark内存管理
spark在1.6之前使用的静态内存管理,spark1.6之后使用的是同一内存管理, spark1.6使用的就是同一内存管理,默认的spark.memory.uselegacy.Mode 是false(同一内存管理)。
executor的静态内存管理,分成3大部分,
第一部分是0.2给task运行,
第二部分占0.2,这0.2里有分为0.8和0.2, 0.2是预留内存,0.8是shuffle聚合内存
第三部分占0.6,这0.6中有划分为2部分,0.1是预留内存,0.9是再划分为两部分,一部分是反序列化用的,一部分是RDD的缓存和广播变量使用
executor的统一内存管理
统一内存管理相较静态内存管理来说比较简单,
第一部分 ,executor的内存有300M是预留内存
第二部分,(总的内存-300M) 的0.25是task运行使用
第三部分,(总的内存-300M)的0.75, 这0.75又划分为俩部分,0.5是给shuffle聚合内存,0.5是RDD的缓存和广播变量,但是这俩部分的内存可以相互借用,当shuffle聚合内存不够用时可以借rdd缓存的内存
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Lu_Xiao_Yue/article/details/86561139