1.普通机制
- 执行流程
1.每一个 map task 将不同结果写到不同的 buffer 中,每个 buffer 的大小为 32K。buffer 起到数据缓存的作用。
2.每个 buffer 文件最后对应一个磁盘小文件。
3.reduce task 来拉取对应的磁盘小文件。 - 总结
1.map task 的计算结果会根据分区器(默认是 hashPartitioner)来决定写入到哪一个磁盘小文件中去。 ReduceTask 会去 Map 端拉取相应的磁盘小文件。
2.产生的磁盘小文件的个数: M(map task 的个数)*R(reduce task 的个数) - 存在的问题,产生的磁盘小文件过多,会导致以下问题:
1.在 Shuffle Write 过程中会产生很多写磁盘小文件的对象。
2.在 Shuffle Read 过程中会产生很多读取磁盘小文件的对象
3.在 JVM 堆内存中对象过多会造成频繁的 gc,gc 还无法解决 运行所需要的内存 的话,就会 OOM。
4.在数据传输过程中会有频繁的网络通信,频繁的网络通信出 现通信故障的可能性大大增加,一旦网络通信出现了故障会 导致 shuffle file cannot find 由于这个错误导致的 task 失 败,TaskScheduler 不负责重试,由 DAGScheduler 负责 重试 Stage。
2.合并机制
- 总结
产生磁盘小文件的个数:C(core 的个数)*R(reduce 的个数)