map和reduce之间交互过程
里面有三个重要的概念:
分区partition
根据key中一个或几个字段,来判断,是要把这条数据发送到哪个reducer
排序sort
根据key中一个或几个字段,来判断,在map输出结果里数据的排序方式,和reduce归并排序的时候数据根据哪几个字段进行比较
分组group
在reducer阶段,根据哪几个字段,来将数据组合成 一个key对多个value(迭代器)的形式,输入到reduce方法中
可以根据key中的部分字段进行分组,但是输入到reducer方法中的那个key是一个分组中,第一条数据的key(包含所有字段)
在map阶段 先排序,然后在 reduce里归并排序的方式有一个好处,就是不需要在reduce里面,把所有数据拿过来进行全量排序,
在归并的过程中,可以做到数据处理的顺序首先是 分组有序,然后同一分组内数据还可以根据sort进行排好序的
一般情况下,只根据key里只有一个字段,既作为分区字段,有作为sort字段,还作为group字段
这样在values迭代器里数据是无序的,如果这个values数据量很大,又想排序后处理,那么就不合适了
这时候可以根据想要排序的字段进行二次排序,这样输入到reduce的values本身就是排好序的
参考:https://www.cnblogs.com/DreamDrive/p/7693452.html