假设我有两个键值数据集 - 数据集A和B,我们称之为它们。我想用集合B中的数据更新集合A中的所有数据,其中两个数据与键匹配。使用Hadoop通过两个数据集进行映射
因为我正在处理大量的数据,所以我使用Hadoop来处理MapReduce。我担心的是,为了在A和B之间进行这种关键匹配,我需要将所有集合A(大量数据)加载到每个映射器实例的内存中。这似乎相当低效。
会不会有推荐的方法来做到这一点,每次都不需要重复加载工作?
一些pseudcode澄清目前我在做什么:
Load in Data Set A # This seems like the expensive step to always be doing
Foreach key/value in Data Set B:
If key is in Data Set A:
Update Data Seta A
如果我理解正确,你说的Hadoop'-input'应该是-both-设置A和B(带有一个标志来区分它们之间的值),然后在缩小步骤中,将被分组在一起,这样就可以加入它们。那是对的吗? – babonk
对,你需要将A和B都输入到你的映射器中,并确保你输出了一个标记,以便减速器能够区分这两者。我还假设你正在编写你自己的'Map'(实现'mapred.Mapper')和'Reduce'(实现'mapred.Reducer')类。像@ joe-k在一个单独的答案中说,Pig,Hive和Cascading都是合法的解决方案,它将为您生成此代码并在Hadoop上运行。 – Shahin
您可以使用布隆过滤器进行小型优化,如果集合A比集合B大很多,并且存在与集合B不匹配并且集合B不适合内存的记录,那么这将很有用。创建一个MapReduce作业,它在Set B上训练Bloom Filter,而不是在最终的MapReduce Job中执行所有建议的操作,但是在使用Bloom Filter的Mapper过滤器Set A中,这将减少Set A中的溢出记录的数量有匹配的B组记录,因此你的工作可能会运行得更快。 – alexeipab