Hadoop MapReduce中是否可以使用以下架构?
使用分布式键值存储(HBase)。因此,除了值之外,还会有一个与值相关联的时间戳。地图&迭代执行减少任务。在每次迭代中,Map应该将在上一次迭代中添加的值接收到商店(可能是具有最新时间戳的?)。 Reduce应该包含Map的输出以及来自商店的对,其商店的密钥与reduce必须在当前迭代中处理的密钥相匹配。 reduce的输出到商店。
如果可能,应该扩展哪些类(例如:Reduce的InputFormat,run()),以便进行上述操作而不是常规操作。如果这是不可能的,有没有其他方法可以实现相同的目标?
答案 0 :(得分:0)
所以你在迭代n-1中的“商店”可能是这样的:
键(时间戳|值)
a 1 | x,b 2 | x,c 3 | x,d 4 | x
在迭代中,这些对添加了: ... b 5 | x, d 6 | x
reducer现在会发现,对于这两个记录,n-1商店中还有另外两个匹配的记录: b 2 | x, d 4 | x
因此,减少阶段的输出将是(无论顺序如何): b 5 | x, d 6 | x, b 2 | x, d 4 | x
这就是你想要的吗?
答案 1 :(得分:0)
所以,如果我真的理解你,我会像下面那样设计它: 您将使用IdentityMapper,此处不需要特殊逻辑。
我会将密钥和时间戳一起作为密钥对的关键。将您的价值留作货币对的价值:
您现在必须实现自己的比较器,以便使用相同的原始键对,但不同的时间戳将被识别为具有相同的键,因此将它们组合在一起。 (GroupingComparator)
重要的是,减速器的对按时间戳排序,降序排列。 (KeyComparator)
看看
Reducer将接收具有相同密钥的所有对 - oops,扰流板...... ,这些应该已经按时间戳排序。如果第一个 - 也是最年轻的 - 时间戳符合此迭代的条件,则会发出此reducer-call的所有键值对。 如果时间戳取消资格,则不会发出具有此密钥的对。
我认为应该这样做。