如何使用Map Reduce连接两个记录集?大多数解决方案(包括在SO上发布的那些解决方案)表明我基于公共密钥发出记录,并在reducer中添加它们来表示HashMap然后采用交叉产品。 (例如Join of two datasets in Mapreduce/Hadoop)
这个解决方案非常好,适用于大多数情况但在我的情况下,我的问题是相当不同的。我正在处理一个拥有数十亿条记录并且采用两组交叉产品的数据是不可能的,因为在很多情况下,hashmap最终会有几百万个对象。所以我遇到了堆空间错误。
我需要一个更有效的解决方案。 MR的重点是处理我想知道的大量数据,如果有任何解决方案可以帮助我避免这个问题。
答案 0 :(得分:0)
不知道这对任何人来说是否仍然相关,但这些天我面临着类似的问题。我的目的是使用键值存储,很可能是Cassandra,并将其用于交叉产品。这意味着:
在A类线上运行时,在Cassandra中查找键。如果存在 - 将A记录合并到现有值(B元素)中。如果不是 - 创建一个键,并将A元素添加为值。
在B类线上运行时,在Cassandra中查找键。如果存在 - 将B记录合并到现有值(A元素)中。如果不是 - 创建一个键,并将B元素添加为值。
这需要为Cassandra提供额外的服务器,可能需要一些磁盘空间,但由于我在云端运行(Google的bdutil Hadoop框架),不要认为它应该是一个问题。
答案 1 :(得分:0)
你应该看看Pig是如何扭曲连接的。我们的想法是,如果您的数据包含太多具有相同密钥的值(即使没有数据偏斜),您可以创建人工密钥并扩展密钥分发。这将确保每个reducer获取的记录数量少于其他数量。对于例如如果你要将“1”加到你键“K1”和“2”的50%,那么另外50%你将以减速器1(1K1)上的一半记录结束,另一半则变为2K2。
如果事先不知道键值的分布,你可以使用某种采样算法。