Shuffle过程即把数据打乱后重新汇聚到不同节点的过程
7.1 Hash Based Shuffle Write
每个ShuffleMapTask根据key的哈希值计算出每个key需要写入的Partition,然后把数据单独写入一个文件,下游的ShuffleMapTask或者ResultTask便会读取此文件进行计算
7.1.1 Basic Shuffle Write实现原理
val manager=SparkEnv.get.shuffleManager //创建ShuffleManager(Hash和Sort BasedShuffle)
创建Hash Based ShuffleManager
writer=manager.getWrite[Any,Any](dep.shuffleHandle,partitionId,context)(HashShuffleWrite和SortShuffleWriter)
得到Hash Based ShuffleWriter
writer.write(rdd.iterator(partition,context).asInstanceOf[Iterator[_<:Product2[Any,Any]]])执行rdd,并将结果写入文件系统
Rdd.iterator进行rdd计算,ShuffleDependency定义Aggregator是够做Map端的聚合,FileShuffleBlockManager.forMapTask()写入结果
写入完成后会将元数据信息写入MapStatus,会被保存在MapOutputTrackerMaster中
writers.numPartitions返回下游Partition数量(Task数量),每个Partition对应一个文件,文件名称shuffle_+shuffleId+_mapId+_reduceId
return