我要求我的映射器在某些情况下可以生成新的键/值供另一个映射器处理。有没有明智的方法来做到这一点?我考虑过编写自己的自定义输入格式(队列?)来实现这一目标。有任何想法吗?谢谢!
编辑:我应该澄清
方法一
Map Step 1 (foo1, bar1) -> out1 (foo2, bar2) -> out2 (foo3, bar3) -> (fooA, barA), (fooB, barB) (foo4, bar4) -> (fooC, barC) Reduction Step 1: (out1) -> ok (out2) -> ok ((fooA, barA), (fooB, barB)) -> create Map Step 2 ((fooC, barC)) -> also send this to Map Step 2 Map Step 2: (fooA, barA) -> out3 (fooB, barB) -> (fooD, barD) (fooC, barC) -> out4 Reduction Step 2: (out3) -> ok ((fooD, barD)) -> create Map Step 3 (out4) -> ok Map Step 3: (fooD, barD) -> out5 Reduction Step 3: (out5) -> ok -- no more map steps. finished --
所以它是完全递归的。一些键/值发出用于减少的输出,一些键/值生成用于映射的新键/值。我真的不知道在给定的运行中可能会遇到多少个 Map 或 Reduction 步骤。
方法2
Map Step 1 (foo1, bar1) -> out1 (foo2, bar2) -> out2 (foo3, bar3) -> (fooA, barA), (fooB, barB) (foo4, bar4) -> (fooC, barC) (fooA, barA) -> out3 (fooB, barB) -> (fooD, barD) (fooC, barC) -> out4 (fooD, barD) -> out5 Reduction Step 1: (out1) -> ok (out2) -> ok (out3) -> ok (out4) -> ok (out5) -> ok
此方法将使映射器提供其自己的输入列表。我不确定哪种方式最终实现起来会更简单。
最佳答案
通过 Hadoop 进行递归的“方法 1”方法迫使您针对每个“递归深度”通过 Map 和 reduce 运行完整数据集。这意味着您必须确定这种情况会持续多久,并且您将遭受巨大的性能影响。
你能肯定地说递归深度是有限的吗?
如果是这样,那么我肯定会选择“方法 2”,并以在一次映射器调用中执行所需递归的方式实际构建映射器。 它更简单并且可以节省大量性能。
关于java - Hadoop 递归映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4954285/