使用Hadoop MapReduce的联接操作

使用Hadoop MapReduce的联接操作,hadoop,mapreduce,elastic-map-reduce,Hadoop,Mapreduce,Elastic Map Reduce,如何使用Map Reduce连接两个记录集?大多数解决方案(包括发布在SO上的解决方案)都建议我基于公共键发出记录,并在reducer中添加它们,比如HashMap,然后取叉积。(例如) 这个解决方案非常好,适用于大多数情况,但在我的情况下,我的问题是相当不同的。我处理的是一个拥有数十亿条记录的数据,不可能取两组的叉积,因为在很多情况下,hashmap最终会有几百万个对象。因此,我遇到了一个堆空间错误 我需要一个更有效的解决方案。MR的全部目的是处理大量数据,我想知道是否有任何解决方案可以帮助我

如何使用Map Reduce连接两个记录集?大多数解决方案(包括发布在SO上的解决方案)都建议我基于公共键发出记录,并在reducer中添加它们,比如HashMap,然后取叉积。(例如)

这个解决方案非常好,适用于大多数情况,但在我的情况下,我的问题是相当不同的。我处理的是一个拥有数十亿条记录的数据,不可能取两组的叉积,因为在很多情况下,hashmap最终会有几百万个对象。因此,我遇到了一个堆空间错误


我需要一个更有效的解决方案。MR的全部目的是处理大量数据,我想知道是否有任何解决方案可以帮助我避免这个问题

我不知道这是否还与任何人相关,但我最近面临着类似的问题。我的意图是使用键值存储,很可能是Cassandra,并将其用于交叉积。这意味着:

在a型线路上运行时,请在Cassandra中查找钥匙。如果存在-将A记录合并到现有值(B元素)。如果不是-创建一个键,并添加一个元素作为值

在B型线路上运行时,在Cassandra中查找钥匙。如果存在-将B记录合并到现有值(A元素)。如果不是-创建一个键,并添加B元素作为值


这将需要为Cassandra增加额外的服务器,可能还需要一些磁盘空间,但由于我是在云中运行的(Google的bdutil Hadoop框架),所以我认为这应该不是什么大问题

您应该了解Pig是如何扭曲连接的。其思想是,如果数据包含太多具有相同密钥的值(即使没有数据倾斜),则可以创建人工密钥并分散密钥分布。这将确保每个reducer获得的记录数少于其他方法。例如,如果将“1”作为后缀添加到键“K1”和“2”的50%,则另50%将以减速机1(1K1)上的一半记录结束,另一半将添加到2K2


如果事先不知道键值的分布,您可以使用某种采样算法。

您做错了什么。这个答案实际上为您提供了在MR中进行连接的唯一方法(缺少通过分布式缓存和其他魔法进行的内存中连接),如果堆用完了,您显然在内存中保留了太多的内容,或者堆大小太小,请尝试使用-XmxSIZE提高它。你的每一行数据都包含数十亿条记录吗?如果你读了这个答案,作者建议在内存中保留两个列表。在我的例子中,这个列表非常大,不是因为每个记录的大小,而是因为列表中的项目数量肯定超过了数百万甚至数十亿。