1

我需要链接多个 MapReduce 流作业,以便对大型数据集执行一些计算。

我打算为每个工作使用多个减速器,以加快整体工作。作为工作流调度程序,我使用 Oozie。

这是一个说明我的问题的插图:假设我有两个文件

File 1:          File 2:
A B 1            A B 3
A C 4            C D 6
B D 2            B D 1

我想要两个映射器和两个化简器,并为 MapReduce 作业获得以下输出:

Output:
A B 4
A C 4
B D 3
C D 6

但这根本不是我得到的,而是我有部分金额。

这是我认为会发生的事情。

由于每个 MapReduce 作业都有多个 reducer,因此下一个作业的输入被拆分为多个文件。这些文件被提供给映射器,然后映射器将它们的输出发送到减速器。似乎映射器将其输出发送到化简器,而无需等待整个输入被处理并使用 name1 进行排序,例如,作为键。

我已经阅读了几个关于使用多个文件作为输入的线程,我认为这不是执行映射侧连接的问题。也许它与分区有关,但我还没有完全理解分区的含义。

有没有办法在将几个映射器的输出发送到减速器之前对其进行排序?或者我可以告诉 Oozie 合并几个 reducer 的输出,以便只有一个文件作为下一个 MapReduce Job 的输入?

4

1 回答 1

1

我对 MapReduce 有点陌生,但如果您没有根据您的示例获得所需的输出,那么您的工作似乎没有正确处理密钥。

默认情况下,Hadoop 流使用 Tab 作为默认字段分隔符,并将从行首到第一个 Tab 字符的所有内容作为 Key。在您的情况下,如果您的输入格式实际上是“A[space]B[space]1”,则需要添加

-D stream.map.output.field.separator= \
-D stream.num.map.output.key.fields=2 \

到您的 Hadoop 流式传输命令,以便将空间设置为列分隔符,将前 2 列设置为键。这会将所有以“A B”开头的行映射到同一个减速器。更多信息可以在这里找到

于 2013-11-01T18:21:12.527 回答