对于给定的MR作业,我需要生成两个输出文件。一个文件应该是Mapper的输出另一个文件应该是Reducer的输出(它只是上面Mapper的聚合)
我可以让映射器和reducer输出都写在一个作业中吗?
编辑:
在作业1(仅映射器阶段)中,输出在一行中包含20个字段,必须将其写入hdfs(file1)。在作业2(Mapper n reducer)中,Mapper从作业1的输出中获取输入,删除几个字段以转换为标准格式(只有10个字段),并将其传递给reducer,由reducer写入文件2。
我需要hdfs中的file1和file2。。。现在我的疑问是,在Job1 mapper中,我是否可以将数据作为file1写入hdfs,然后修改相同的数据并将其传递给reducer。
PS:到目前为止,我正在使用两个具有链接机制的作业。第一个作业只包含映射器,第二个作业包含映射器和还原器。
您可以使用MultipleOutputs类为映射器定义一个输出,并(可选)为reducer定义一个。对于映射器,您必须写两次:一次用于输出文件(使用MultipleOutputs),一次用于向reducer发射对(像往常一样)。
然后,您还可以利用ChainMap类,在单个作业中定义以下工作流:
映射器1(文件1)->映射器2->还原器(文件2)
老实说,我从来没有用过这种逻辑,但你可以试一试。祝你好运