【问题标题】:A join operation using Hadoop MapReduce使用 Hadoop MapReduce 的连接操作
【发布时间】:2013-05-19 09:36:21
【问题描述】:

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

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

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

【问题讨论】:

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

标签: hadoop mapreduce elastic-map-reduce


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多