shuffle实现的功能
- 分区
决定当前key交给那个reducer进行处理
相同的key必须在一个reduce task中
默认:按照key的hashCode值对reduce的个数进行取余
如果是自定义分区,默认是对key进行分区,但是我们也可以根据value进行分区
- 分组
将相同的key的value进行合并,key相同的话,会分到同一组
在mapReduce阶段
一行调用一次map方法
key相同的调用一次reduce方法
- 排序
按照key对应的keyvalue进行排序,字典排序
shuffle的工作原理
- map端的shuffle
spill:溢写
每一个map处理好的结果都会进入环形缓冲区(缓冲区内存为100M)当环形缓冲区使用超过80%以后开始溢写
.
分区:确定每一条keyvalue交给哪个reduce处理(类似打标签)
key value flag hadoop 1 reduce0 hive 1 reduce1 hbase 1 reduce0 hadoop 1 reduce0 排序:将相同分区的数据进行分区内的排序
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hive 1 reduce1 当整个还中区达到阈值的80%,开始溢写
将当前分区排序后数据写入到磁盘中,变成了一个个小文件,最终生成多个小文件(假设生成的两个文件相同)
file1:
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hive 1 reduce1 file2:
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hive 1 reduce1 - merge合并
将生成的小文件进行合并
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hive 1 reduce1 hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hive 1 reduce1 排序:将相同分区的数据进行分区排序
end_file(map task1)
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hive 1 reduce1 hive 1 reduce1
map task结束,通知appMaster,appMaster拉取数据
- reduce端的shuffle
map task1
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hive 1 reduce1 hive 1 reduce1 map task2
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hive 1 reduce1 hive 1 reduce1 reduce启动多线程通过http到每台机器上拉取属于自己的分区数据
reduce1
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 reduce2
key value flag hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hadoop 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 hbase 1 reduce0 merge:合并,将每个map task的结果中数据自己分区的数据进行合并
排序:对整个属于自己的分区数据进行排序
分组:将相同key的value进行合并
reduce0
key value hadoop [1,1,1,1,1,1,1,1] hbase [1,1,1,1] reduce1
key value hive [1,1,1,1]