对于给定的 MR 作业,我需要生成两个输出文件。 一个文件应该是Mapper的输出 另一个文件应该是 Reducer 的输出(它只是上面 Mapper 的聚合)
我能否将 mapper 和 reducer 输出都写在一个作业中?
编辑:
在作业 1 中(仅 Mapper 阶段)输出包含单行中的 20 个字段,必须将其写入 hdfs(file1)。 在 Job 2(Mapper n reducer)中,Mapper 从 Job1 的输出中获取输入,删除几个字段以使其成为标准格式(仅 10 个字段)并将其传递给写入 file2 的 reducer。
我需要 hdfs 中的 file1 和 file2 ... 现在我的疑问是,在 Job1 映射器中,我是否可以将数据作为 file1 写入 hdfs,然后修改相同的数据并将其传递给 reducer。
PS:截至目前,我正在使用 2 个具有链接机制的作业。第一个作业只包含 mapper,第二个作业包含 mapper 和 reducer。
最佳答案
你或许可以使用 MultipleOutputs类来定义映射器的一个输出和(可选的)缩减器的一个输出。对于映射器,您将不得不编写两次:一次用于输出文件(使用 MultipleOutputs),一次用于向 reducer 发射对(像往常一样)。
然后,您还可以利用 ChainMapper类,在单个作业中定义以下工作流:
Mapper 1 (file 1) -> Mapper 2 -> Reducer (file 2)
老实说,我从来没有用过这个逻辑,但你可以试一试。祝你好运!
关于hadoop - 是否可以在 Hadoop Mapreduce 中为单个作业打印 Mapper 和 reducer 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34471724/