Shuffle描述的是从Map执行完毕到Reduce开始运行之前数据的传递过程。
主要分为两个阶段:
1. Map result-->磁盘
- map task会将结果放到内存的缓冲区中,当缓冲区中占用的比例超过阈值时,tasktracker会启动一个线程将结果写入磁盘,combiner会在spill之前执行一轮。
- 当多个map task都将结果写入磁盘,会在磁盘中生成大量小文件,tasktracker会启动另一个线程将这些小文件合并为一个大文件,合并之前会再次进行combiner,同时会保存一个索引文件,记录应该发送到每个reducer的数据块在大文件中的偏移量。
2. 磁盘-->Reduce input
- reducer 会通过heartbeat周期性的向jobtrakcer查询map的进度和datanode节点地址和当前reducer在大文件中的偏移量(查找索引文件)
- 如果有mapper 完成任务,会启动多个线程通过http协议向对应datanode请求数据,获取数据之后会进行归并排序,使得具有相同的key的kv对连在一起,每个key启动一个reduce task进行相应的处理。
网友评论