10.10 spark-shuffle,寻址
HashShuffle
普通机制:
map task的计算结果,会根据分区器(default:HashPartitioner)来决定写入到哪一个磁盘小文件里面去
reduce task会去Map端拉去相应的小文件
产生磁盘小文件的个数公式:M(map task的个数)*R(reduce task的个数)
磁盘小文件过多会有什么问题
1,在shuffle wirte过程中会产生很多写的对象
2,在shuffle read过程会产生很多读磁盘的对象
3,在数据传输过程中,会有频繁的网络通信
在JVM堆内存中对象过多会造成频繁的GC,GC还是无法解决所需要的内存的话,就会OOM频繁的网络通信,出现通信故障的可能性大大的增加了,一旦网络通信出现了故障,就会出现如下的错误:shuffle file connot find 由于这个错误导致的task失败,那么TaskScheduler不负责重试,由DAGScheduler负责重试stage
合并机制:
产生磁盘小文件的公式:C(core的个数)*R
SortShuffle
普通机制
1,map task的计算结果会写入到一个内存数据结构里面,内存数据结构默认是5M
2,在shuffle的是候会有一个定时器,不定期的去估算这个内存数据结构的大小,如果现在内存数据结构的大小是5.01M,那么他会申请5.01*2-5=5.02M内存给内存数据结构
3,如果申请成功,不会进行溢写
4,如果申请不成功,这个时候就会有溢写的过程
5,在溢写之前,会将内存数据结构里面的数据进行排序,以及分区
6,然后开始写磁盘,写磁盘是以bacth的形式去写,一个batch是1w条数据
7,map task执行完成之后,会将这些磁盘小文件合并成一个大的磁盘文件,同时生成一个索引文件
8,reduce task去map端拉数据的时候,首先解析索引文件,根绝索引文件在去拉取数据他自己的数据
产生磁盘小文件的公式:2倍的maptask的个数
bypass运行机制
产生磁盘小文件的公式:2倍的maptask的个数
shuffle怎么寻址:
BlocakManager:块管理者
管理范围:RDD缓存数据,广播变量,磁盘小文件
四个重要对象:
Memstore:主要管理内存中的数据
DiskStore:管理磁盘上的数据
ConnectionManager:链接管理者
BlocakTransforeService:链接建立成功后,数据库对象操作
BlocakManager在每一儿Executor中只有一个
1,map task的执行情况会被封装到一个mapstatue对象里面去,通过map task所在的Executor里面的MapOutputTracnkerWorker发送给Driver端中MapOutputTracnkerMaster
2,在所有的map task执行完毕后,Driver端MapOutputTracnkerMaster就掌握了所有的磁盘小文件地址
3,在reduce task执行之前,会通过reduce task所在的Executor里面的MapOutputTracnkerWorker向Driver里面的MapOutputTracnkerMaster获取磁盘小文件地址
4,磁盘小文件地址已经找到,数据的传输通过BlockManager来做
首先reduce task所在的Executor里面的BlockManager去链接map task所在的Executor里面的BlockManager链接建立后,BlocakTransforeService负责去拉去数据
5,reduce task的数据源就找到了