对于给定的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 .
1 回答
您也许可以使用MultipleOutputs类为映射器定义一个输出,并(可选)为reducer定义一个输出 . 对于映射器,您必须编写两次:一次用于输出文件(使用MultipleOutputs),一次用于将对发送到reducer(像往常一样) .
然后,您还可以利用ChainMapper类在单个作业中定义以下工作流:
说实话,我从来没有使用过这个逻辑,但你可以尝试一下 . 祝好运!