本文xrds:article在“权衡示例”小节中描述了每条记录与输入文件的所有其他记录连接的方式(第一个)。我想知道如果不将整个输入文件只传递给一个映射器,那么在mapreduce中怎么可能呢?
答案 0 :(得分:2)
MapReduce有三种主要的连接类型(还有一些其他连接)。
减少边连接 - 对于这两个数据集,输出“外键”作为映射器的输出键。您可以使用类似MultipleInputs的内容一次加载两个数据集。在reducer中,来自两个数据集的数据由外键组合在一起,这允许您在那里进行连接逻辑(如Cartesian产品)。这是一般目的,几乎适用于所有情况。
复制加入 - 您将较小的数据集推送到DistributedCache。在每个问题中,您将较小的数据集从那里加载到内存中。当记录通过映射器时,将数据连接到内存数据集。这是你在问题中建议的。它应该仅在较小的数据集可以存储在内存中时使用。
复合加入 - 这个有点小众,因为它需要设置。如果外键使用排序和分区两个数据集,则可以使用CompositeInputFormat进行复合连接。它基本上做了类似合并的操作,非常有效。
我的书MapReduce Design Patterns的无耻插件:有一整章关于连接(第5章)。
在此处查看该书的代码示例:https://github.com/adamjshook/mapreducepatterns/tree/master/MRDP/src/main/java/mrdp/ch5