二级排序-交给hadoop框架或自己在reducer中完成

hzbexzde  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(314)

我读过关于二次排序的文章,其中不仅需要对每个键进行排序,还需要对每个键按部分值进行排序。
有两种方法:
在reducer中为每个键缓存值,并自己对值进行排序
把工作交给hadoop框架,通过指定定制的comparator、partitioner……您不仅需要启用按键排序,还需要启用按值排序
我的问题是,你什么时候推荐第一种方法,什么时候推荐第二种方法?
如我目前所见-如果框架已经执行排序,为什么不同时按键和值排序…如果有副作用,请更正我。例如,哪个应该更快?
我知道“按减速机排序”的最大问题是记录的数量,但我想了解整个情况。

vfwfrxfs

vfwfrxfs1#

你对二次排序的理解是正确的。在回答给定的两个场景之前,我想让您知道在调用reducer的reduce()方法之前会发生什么。
每个reducer从所有Map器中复制其相关的分区结果,并作为多个溢出文件存储在reducer的磁盘中。后台线程合并所有这些溢出文件并创建一个单独的排序文件。
最后一个sinlge排序文件中的记录首先按自然键排序。如果配置了分组键(secondar sorting),则每个键的记录都会在内部按分组键排序。
因此,决定何时使用给定的2种方案的决定取决于给定键的单个排序文件中有多少reord。reduce方法通过reduce()方法中给出的iterable引用,从单个排序文件中逐个读取键的所有值。
如果任何java排序集合(如treeset/treemap)都能够存储一个键的所有值,前提是java集合的大小不会占用reducer的jvm堆内存,那么您可以跳过二次排序,并且可以使用java排序集合本身来实现您喜欢的排序顺序。
在这种情况下,如果java排序集合的jvm堆内存不足以存储一个键的所有值,那么您应该更喜欢mapreduce的自定义二次排序,它将在单个排序文件创建阶段的磁盘合并/排序阶段对键进行排序(自然排序)并对键的所有值进行内部排序(二次排序),并将值按准备好的排序顺序传递给每个键的reduce方法。

相关问题