java - Hadoop 递归映射

标签 java hadoop mapreduce

我要求我的映射器在某些情况下可以生成新的键/值供另一个映射器处理。有没有明智的方法来做到这一点?我考虑过编写自己的自定义输入格式(队列?)来实现这一目标。有任何想法吗?谢谢!

编辑:我应该澄清

方法一

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/

相关文章:

java - 如何根据屏幕上下文监听特定的 Java 按键事件?

scala - Spark SQL配置单元连接错误

java - "Variable might not have been initialized"是什么意思?

java - kotlin 中的 lateinit、懒惰和单例模式

hadoop - 无法实例化org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient

hadoop - 我可以在 Jupyter/IPython 中使用 hadoop 吗?

hadoop - 在这个用例中什么是数据仓库

hadoop - 如何访问Hive日志信息

java - JNI 对象指针

java - Sqoop,Java中将HDFS导出到MySQL