【发布时间】: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