我读到了关于二级排序的问题,其中不仅需要为每个键排序键,而且还需要按值的一部分排序。
有两种方法可以做到这一点:
我的问题是,您何时会先推荐第二种方法?
正如我目前所看到的那样 - 如果框架已经执行了排序,为什么不同时按键和值对其进行排序...如果有一些副作用,请纠正我。例如,哪个应该更快?
据我所知,“in-Reducer排序”的最大问题是记录数量,但我想全面了解。
答案 0 :(得分:0)
您对二级排序的理解是正确的。在回答给定的2个场景之前,我想告诉你在Reducer的reduce()方法之前发生了什么。
每个reducer将其相关的分区结果从reducer磁盘中的所有映射器和存储器复制为多个溢出文件。后台线程合并所有这些溢出文件并创建单个排序文件。
最终sinlge排序文件中的记录首先按自然键排序。然后,每个键的记录在内部按分组键(第二个排序)排序(如果已配置)。
因此决定何时使用给定的2个场景的决定取决于给定键的单个排序文件中有多少reords。 reduce方法通过reduce()方法中给出的可迭代引用从单个排序文件中逐个读取键的所有值。
如果任何Java排序集合(如TreeSet / TreeMap)能够存储密钥的所有值,只要java集合的大小不会破坏reducer的JVM堆内存,那么您可以跳过二级排序并且您可以使用Java排序集合本身来实现您喜欢的排序顺序。
但是,如果Java排序集合的JVM堆内存不足以存储密钥的所有值,那么您应该更喜欢Mapreduce的自定义二级排序,它将对密钥进行排序(自然排序)和排序单个排序文件创建阶段的磁盘合并/排序阶段中的内部键(辅助排序)的所有值,并将准备好的排序顺序中的值传递给每个键的reduce方法。