使用hadoopmapreduce的连接操作

mfuanj7w  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(333)

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

2nbm6dog

2nbm6dog1#

你应该看看pig是如何扭曲连接的。其思想是,如果您的数据包含太多具有相同密钥的值(即使没有数据倾斜),则可以创建人工密钥并分散密钥分布。这将确保每个reducer获得的记录数少于其他方法。例如,如果将“1”后缀为键“k1”和“2”的50%,则另50%的后缀将以减速机1(1k1)上的一半记录结束,另一半将转到2k2。
如果之前不知道键值的分布,可以使用某种采样算法。

wgmfuz8q

wgmfuz8q2#

不知道这是否对任何人都有意义,但我最近也面临着类似的问题。我的意图是使用键值存储,很可能是cassandra,并将其用于交叉积。这意味着:
在a类线路上运行时,在Cassandra中寻找钥匙。如果存在-将a记录合并到现有值(b元素)。如果不是-创建一个键,并添加一个元素作为值。
在b型线路上运行时,寻找Cassandra中的钥匙。如果存在-将b记录合并到现有值(a元素)中。如果不是-创建一个键,并添加b元素作为值。
这将需要为cassandra提供额外的服务器,可能还需要一些磁盘空间,但由于我是在云中运行的(google的bdutil-hadoop框架),所以我认为这应该不是什么大问题。

相关问题