起初spark向hadoop看齐,根据key的hash值往外溢出文件,每个task都分成3种类别的数据,把不同类别的数据汇聚计算最终的结果,reducer会根据分区号找到自己类别的数据汇聚成一个大的集合。
缺点:每个map溢出的文件之间不互通,任务有多少个reduce就要开放多少个reduce溢出文件,导致设置分区数越大,消耗的物流空间越大,大量的溢出文件容易造成OOM
优化后的shuffle使用合并机制,复用buffer,hash算法会根据key进行分类,同一个进程中把相同的key放在同一个buffer中,这样溢出文件之间是互通的,他们只会按照自己的分区溢出到同一个文件当中