shuffle
1.发生的阶段,map->reduce的中间过程
2.流程
input数据输入-> <keyvalue> -> <0,hadoop spark>
map接受输入的数据,<0,hadoop spark>
3.进入shuffle阶段
map的结果输出到内存中(每个map任务)
内存大小默认是100M //用户可以自定义
环形缓冲区,<hadoop,1><spark,1>
当内存到达一定大小的时候,默认是80% //用户可以自定义
触发溢写操作spill
溢写到本地磁盘中,
1.分区,partition,划分区域
决定了map输出数据,被哪个reduce任务进行处理
默认情况下使用哈希值取余的方式来制定规则的
分区规则,可以用户自己制定
2.排序sort
对分区中的数据进行排序
在内存中排序速度非常快
比较
3.溢写spill
当排序完成以后才会进行溢写操作,将内存数据写入到磁盘中
溢写的操作是单独开启一个线程来进行的
所以后续的数据也是可以继续写入的
不断的溢写之后,在本地磁盘中就会形成很多的溢写文件
4.合并merge
1.发生的阶段,map->reduce的中间过程
2.流程
input数据输入-> <keyvalue> -> <0,hadoop spark>
map接受输入的数据,<0,hadoop spark>
3.进入shuffle阶段
map的结果输出到内存中(每个map任务)
内存大小默认是100M //用户可以自定义
环形缓冲区,<hadoop,1><spark,1>
当内存到达一定大小的时候,默认是80% //用户可以自定义
触发溢写操作spill
溢写到本地磁盘中,
1.分区,partition,划分区域
决定了map输出数据,被哪个reduce任务进行处理
默认情况下使用哈希值取余的方式来制定规则的
分区规则,可以用户自己制定
2.排序sort
对分区中的数据进行排序
在内存中排序速度非常快
比较
3.溢写spill
当排序完成以后才会进行溢写操作,将内存数据写入到磁盘中
溢写的操作是单独开启一个线程来进行的
所以后续的数据也是可以继续写入的
不断的溢写之后,在本地磁盘中就会形成很多的溢写文件
4.合并merge
将各个分区的文件合并在一起,形成一个大文件
------------------------map部分------------------------------------------------------
------------------------reduce端-----------------------------------------------------
5.去map开启开启线程,通过HTTP网络方式去,copy对应的数据
加载到内存,同样的内存也有大小
流程同map一样
6.分组,group(将相同key的value加在一起)
判断key
指定环形缓冲区的配置
<property>
<name>mapreduce.task.io.sort.mb</name>
<value>100</value>
</property>