0

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

这个解决方案非常好,适用于大多数情况,但就我而言,我的问题完全不同。我正在处理一个拥有数十亿条记录的数据,并且不可能对两组进行叉积,因为在许多情况下,哈希图最终将拥有几百万个对象。所以我遇到了堆空间错误。

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

4

2 回答 2

0

不知道这是否仍然与任何人相关,但这些天我面临着类似的问题。我的意图是使用键值存储,最有可能是 Cassandra,并将其用于交叉产品。这表示:

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

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

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

于 2014-06-02T21:39:46.673 回答
0

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

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

于 2015-01-06T05:35:04.710 回答