我要求我的映射器在某些情况下可以为另一个映射器生成一个新的键/值来处理。有理智的做法吗?我已经考虑过编写自己的自定义输入格式(队列?)来实现这一目标。有任何想法吗?谢谢!
编辑:我应该澄清
方法1
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 --
所以它是完全递归的。一些键/值发出输出以进行缩减,一些键/值生成用于映射的新键/值。我真的不知道在给定的运行中我可能会遇到多少地图或减少步骤。
方法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
此方法将使映射器提供其自己的输入列表。我不确定最终实现哪种方式会更简单。
答案 0 :(得分:1)
使用oozie [网格工作流程定义语言]将两个M / R作业串起来,第一个作业只有映射器。 http://yahoo.github.com/oozie
答案 1 :(得分:1)
通过Hadoop进行递归的“方法1”方法强制您通过Map和reduce为每个“递归深度”运行完整数据集。这意味着你必须确定这有多深,你将受到巨大的性能影响。
您能肯定地说递归深度是有限的吗?
如果是这样,那么我肯定会选择“方法2”并实际构建映射器,以便在一个映射器调用中执行所需的递归。 它更简单,为您节省了很多性能。
答案 2 :(得分:1)
据我所知,Hadoop MR框架在工作开始时正在规划应该执行哪些地图任务,并且还没有为新的地图任务动态显示做好准备。
我建议两种可能的解决方案:
a)如果你在地图阶段发射另一对 - 将它们提供给同一个映射器。因此mapper将采用其通常的参数,并且在处理之后将查看某种内部本地队列以供处理其他对。如果有少量次级对,它将很好用,并且数据局部性并不重要。
b)如果您确实在处理目录或类似的东西 - 您可以遍历作业包主体中的结构,并立即构建所需的所有拆分。