1

这篇文章xrds:article在“一个权衡的例子”小节中描述了一种方法(第一个),将每条记录与输入文件的所有其他记录连接起来。我想知道如果不在一个映射器中传递整个输入文件,在 mapreduce 中怎么可能。

4

1 回答 1

2

MapReduce 有三种主要的连接类型(还有其他几种)。

Reduce Side Join - 对于两个数据集,您输出“外键”作为映射器的输出键。您可以使用MultipleInputs之类的东西一次加载两个数据集。在 reducer 中,来自两个数据集的数据通过外键汇集在一起​​,这允许您在那里执行连接逻辑(可能像笛卡尔积)。这是通用的,几乎适用于所有情况。

复制连接- 您将较小的数据集推送到DistributedCache中。在每种情况下,您都将较小的数据集从那里加载到内存中。当记录通过映射器时,将数据与内存数据集连接起来。这就是您在问题中的建议。只有当较小的数据集可以存储在内存中时才应该使用它。

Composite Join - 这个有点小众,因为它需要设置。如果两个数据集按外键排序分区,则可以使用CompositeInputFormat进行复合连接。它基本上做了一个非常有效的类似合并的操作。


我的书MapReduce 设计模式的无耻插件:有一整章关于连接(第 5 章)。

在此处查看本书的代码示例:https ://github.com/adamjshook/mapreducepatterns/tree/master/MRDP/src/main/java/mrdp/ch5

于 2012-12-23T15:56:03.660 回答