以前一直理解为 同一组key汇聚到reduce计算,今天写了组排序器和map阶段排序器 并且key为对象 时:突然如果组排序器代表的排序逻辑所定义的相同key在一次reduce计算中,还是即使使用组排序器,还是以key的hashCode为界定呢?
首先梳理目前的已知MR流程:
首先Hadoop在使用定义好的split大小,使用fileSystem的seek()及getBlocklocations()来读取规定大小的数据,这个过程叫split.
split会被Hadoop的读取器(默认为行读取器)逐行读取数据,这里拿到的每行数据分别经过Map计算(我们自定义的逻辑),计算结果为K-V-P k-v代表键值对 p代表partitions,也就是对reduce个数的控制。
这些k-v-p数据会先放在一个内存缓冲区中(环形缓冲区,默认100M),当数据大小达到阈值0.8,开始溢写到磁盘形成小文件。当然在溢写前完成了排序逻辑(分区有序,分区内部数据有序)。当本节点数据全部读取完成此节点会有多个小文件,他们内部是有序的但是文件间无序,所以再进行过归并! 这个过程的排序规则通过排序器来完成。如果map输出的key为对象,实现compare来完成大小定义,当然自定义排序器可以改变它本身定义的排序逻辑。
多个map节点网络传输数据到对应的reducer 具体到哪个是由数据的P来界定。这个过程我们叫shufle.
一个reduce接收多个map的文件完毕,还要进行归并处理,合并成为1个或几个文件。这个过程要经过分组排序器,因为map端定义的排序逻辑对按照这个逻辑来完成对reduce端要汇聚的数据的界定,当我们再不改变数据排序的前提下,界定我们reduce方法想要汇聚的数据时(这些数据的排序还是有map端定义的排序器来完成的),这就是使用组排序器的时机。
组排序器界定的数据组内完成我们要计算的逻辑。整个MR就完成了。
以上是我脑海中的已知知识,但是实际解决问题是还是有事分辨不清在组排序器使用后 哪些数据到底是哪些数据汇聚为一组。很多时候下意识的以为还是原来的规则。所以写这篇博客。
经过手写一段测试demo计算后:
结论:经过自定义reduce方法的一组数据确实由组排序器决定。
造成这种困惑的原因:设计map端排序器时没有考虑明确,到时数据处理发生的意向外的效果,进而对这块知识产生了怀疑