在MapReduce中单独处理多个输入文件

时间:2017-02-07 18:07:02

标签: java hadoop dictionary mapreduce

我正在开发Map Reduce项目"就像Word计数示例"有一些变化,在我的情况下,如果我运行程序,我有很多文件需要处理, 我希望每个地图都能获取其中一个文件并将其与其他文件分开处理#34;我希望文件的输出独立于其他文件输出"

我尝试使用:

Path filesPath = new Path("file1.txt,file2.txt,file3.txt");

MultipleInputs.addInputPath(job, filesPath, TextInputFormat.class, Map.class);

但我得到的输出是将所有文件输出混合在一起,如果一个单词出现在多个文件中,它会处理一次,而这就是我不想要的。 我希望每个文件中的单词计数分开。

那我怎么用呢?

如果我把文件放在一个目录中,它会独立处理吗?

2 个答案:

答案 0 :(得分:0)

这是Hadoop map-reduce的工作方式。所有文件都合并在一起,排序和按键,所有具有相同密钥的记录都被送到映射器。

如果您希望一个映射器只能看到一个文件,则必须为每个文件运行一个作业,并且还必须强制配置每个作业只有一个映射器。

答案 1 :(得分:0)

在Map任务中,您将能够获取正在处理的记录的文件名。

Get File Name in Mapper

获得文件名后,可以将其添加到Map输出键,形成复合键,并实现分组比较器,将同一文件中的键分组到一个reducer中。