首页 文章

多个MapReduce作业,包含多个文件作为输入和多个reducer

提问于
浏览
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

我想有两个映射器和两个reducers并为MapReduce作业获取以下输出:

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

但这根本不是我得到的,而是我有部分总和 .

这就是我认为发生的事情 .

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

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

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

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"开头的所有行映射到同一个reducer . 更多信息可以在here找到

相关问题