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怎么寻址:

10.10 spark-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的数据源就找到了