对于给定的MR作业,我需要生成两个输出文件。 一个文件应该是Mapper的输出 另一个文件应该是Reducer的输出(它只是Mapper上面的聚合)
我可以将mapper和reducer输出都写在一个作业中吗?
编辑:
在作业1中(仅限映射器阶段)输出在一行中包含20个字段,必须将其写入hdfs(file1)。 在Job 2(Mapper n reducer)中,Mapper从Job1输出中获取输入,删除几个字段以引入标准格式(仅10个字段)并将其传递给reducer,后者写入file2。
我需要在hdfs中同时使用file1和file2 ...现在我的疑问是,无论是在Job1映射器中我是否可以将数据写入hdfs作为file1,然后修改相同的数据并将其传递给reducer。
PS:截至目前,我正在使用2个具有链接机制的作业。第一个作业只包含mapper,秒作业包含mapper和reducer。答案 0 :(得分:2)
您也许可以使用MultipleOutputs类为映射器定义一个输出,并(可选)为reducer定义一个输出。对于映射器,您必须编写两次:一次用于输出文件(使用MultipleOutputs),一次用于将对发送到reducer(像往常一样)。
然后,您还可以利用ChainMapper类在单个作业中定义以下工作流程:
Mapper 1(文件1) - >映射器2 - > Reducer(文件2)
说实话,我从未使用过这种逻辑,但你可以尝试一下。祝你好运!